IFRAMEタグによるXAMLファイルの参照
XAMLファイルを、HTMLのIFRAMEタグで、参照しています。
ブラウザが直接XAMLファイルを開く場合と同様にLoose XAML と考えて良いようです。
SilverlightのコンポーネントがXAMLを開くのと異なり、WPFのXAMLの機能になります。
利点は、
1.WPFと同等の機能になります。Viewport3Dなども記述できます。
2.HTML編集時にも、表示を見ながらHTML部分の編集ができます。
欠点は、
1.HTMLエディタ(HTMLDo)で、セキュリティ関連の警告が表示される。
2.HTMLとは別ファイルなので、スクリプトとして埋め込むよりは遅い。
※MIME タイプ Application/xaml+xml とクロスドメインの問題は現状無いように見えます。
IFRAME は、以下のようです。
- <iframe height="300" src="mirror2.xaml"></IFRAME>
HTMLDoエディタでは、<iframe src="..." /> と書かないことが重要でした。
終了タグ<IFRAME>を独立して記述しないと、それ以降が表示されませんでした。
以降をIFRAME未サポートブラウザ用の代替文字と見なしているのでは。
DataToriggerを使った入力のサンプル
|
3D座標値からの描画サンプル(Viewport3D)
|
|
|
1.サンプル・プログラム
1.1.サンプルプログラムを作ってわかったこと
HTMLファイル中に、XAMLをスクリプトとして記述した場合は、Silverlight のコンポーネントに渡されることから来る制約があります。
IFRAMEを使う場合は、制限はなく、WPFのXAMLの能力になります。
- IFRAMEを使う場合は、バインディングが使える。開始時の座標など共通の初期値を1箇所に書くことができる。これは、初期値であって、実行中に同じ変数を参照するようにできるわけではない。
- トリガー条件に、SourceNameプロパティが使用できる。Silverlight の場合は、トリガーを発生するエレメントに書く以外にない。
- DataTorigger を使うと、チェックボックスのチェック状態などをトリガにできる。
- 以上の差は、おそらく、未コンパイルのXAMLを処理することを Silverlightのコンポーネントは目的にしていないためだと考える。(ブラウザサイドでのコンパイル)
- Viewport3Dなど、Silverlight にないものは Silverlight のコンポーネントは実行できない。
1.2.サイクロイドのサンプル
HTMLファイル中に、XAMLをスクリプトとして記述したサンプルと同じ内容です。STARTボタンで実行できる点が異なります。
1.2.1.数式部分
数式部分は、ワードで書きました。これを xps2xaml で、XAMLに変換しました。
1.2.2.図形部分
Visual Studio で WPFプロジェクトを作り、Pageファイルを追加して作りました。確認は、IEで直接 Page.xaml を開いて行いました。
1.2.3.XAMLスクリプト
最初が Page になっています。IFRAMEにはナビゲーションボタンが表示されるもののようです。Page で ShowsNavigationUI を 偽に設定すると、これを抑止できます。
- <?xml version="1.0" encoding="UTF-8"?>
- <Page ShowsNavigationUI="false"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Background="Bisque" Width="300" Height="360">
- <StackPanel>
- <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 -70"/>
- </Canvas.RenderTransform>
- :
- : 数式部分の記述
- :
- </Canvas>
- // STARTボタン
- <Button Content="START" Name="button1"/>
- <StackPanel.Triggers>
- :
- : イベントの検出と処理
- :
- </StackPanel.Triggers>
- </StackPanel>
- </Page>
1.2.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 は、原点に対して回転します。
1.2.5.イベントの検出と処理
ボタンの Click イベントを使ってアニメーションをスタートします。同じ時点から、同じ時間(20秒)動作します。
- マークを、「転円の中心」を中心に2回転(720°)
- マークの乗った Canvas を、原点を中心に360°回転
- 転円を、原点を中心に360°回転
- <EventTrigger SourceName="button1" RoutedEvent="Button.Click">
- <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 SourceName="button1" RoutedEvent="Button.Click">
- <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 SourceName="button1" RoutedEvent="Button.Click">
- <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>
1.3.DataToriggerを使った入力のサンプル
下の段の TextBox のスタイルをリソースに宣言して、ここでチェックボックスの変化をトリガします。
- <Page ShowsNavigationUI="false"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
- <Grid Background="Bisque" Width="200" Height="100">
- <Grid.Resources>
- <Style x:Key="tb2_style" TargetType="TextBox">
- <Style.Triggers>
- <DataTrigger Binding="{Binding ElementName=cb1, Path=IsChecked}" Value="True">
- <Setter Property="Text" Value="{Binding ElementName=tb1, Path=Text}" />
- </DataTrigger>
- <DataTrigger Binding="{Binding ElementName=cb1, Path=IsChecked}" Value="False">
- <Setter Property="Text" Value="" />
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </Grid.Resources>
- <StackPanel Margin="8,8,8,8">
- <DockPanel>
- <Label Content="入力:" />
- <TextBox Name="tb1" />
- </DockPanel>
- <TextBox Name="tb2" Style="{StaticResource tb2_style}" />
- <CheckBox Name="cb1" Content="上の段から下の段にコピー" />
- </StackPanel>
- </Grid>
- </Page>
1.4.3D座標値からの描画サンプル
- カメラ
- 光源
- 物体
を、記述します。物体のジオメトリは別のファイルになっています。Blend の球を XAMLでエクスポートしたものです。
- <Page ShowsNavigationUI="False"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
- <!--リソース-->
- <Page.Resources>
- <ResourceDictionary>
- <ResourceDictionary.MergedDictionaries>
- <!--ジオメトリを別のXAMLファイルから読み込む-->
- <ResourceDictionary Source="sphere.xaml"/>
- </ResourceDictionary.MergedDictionaries>
- </ResourceDictionary>
- </Page.Resources>
- <Grid>
- <Viewport3D x:Name="viewport1">
- <Viewport3D.Camera><!--カメラ-->
- <PerspectiveCamera
- LookDirection="-1, -1, -1" Position="2,2,2" FieldOfView="45"/>
- </Viewport3D.Camera>
- <ModelVisual3D>
- <ModelVisual3D.Content><!--ライト-->
- <DirectionalLight Color="White" Direction="1,-1,-1"/>
- </ModelVisual3D.Content>
- </ModelVisual3D>
- <ModelVisual3D>
- <ModelVisual3D.Content>
- <!--リソースで定義したジオメトリを使用-->
- <GeometryModel3D Geometry="{StaticResource _sphere}">
- <GeometryModel3D.Material>
- <MaterialGroup>
- <!--物体の色-->
- <DiffuseMaterial Brush="Yellow"/>
- <!--物体の発光-->
- <EmissiveMaterial Brush="Gray"/>
- <!--ハイライト-->
- <SpecularMaterial Brush="White" SpecularPower="10"/>
- </MaterialGroup>
- </GeometryModel3D.Material>
- </GeometryModel3D>
- </ModelVisual3D.Content>
- </ModelVisual3D>
- </Viewport3D>
- </Grid>
- </Page>
Blend で出力した XAML を ResourceDirectionary にします。
- <ResourceDictionary
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
- <MeshGeometry3D x:Key="_sphere"
- Positions="-0.000001 -0.000001 -1.0 ...
- :
- </MeshGeometry3D>
- </ResourceDictionary>
|