XAMLの利用局面
1.XAMLを使う局面
- XAMLを直接ブラウザで開く
- XAMLをHTMLのiframeタグで開く
- WPFアプリケーション
- WPFブラウザアプリケーション
- Silverlight
Windows上でWPFアプリケーションを使うのは旧来のEXEを作る開発方法と同様で特に制約はありません。
それ以外の方法は、ブセットだったり、パーミッションで制限されていたりします。
2.ファイルとの関係
ブラウザは、XAMLを開くことができます。
- XAML ページ
- HTMLにホストされるXAMLファイル
- HTMLに埋め込まれたXAMLスクリプト
HTMLマークアップのページで使われるXAMLの種類をCSS のときの呼び方を倣って、以下のようにします。
- 外部参照
異なるXAMLファイルを参照する。
- 埋め込み
同じファイルに記述する。<SCRIPT>タグで記述する。
- インライン
XAML以外の文の一部に記述。これは、あることかどうかわかりません。<A>タグ内に、JavaScriptが書けるので可能性があるのかと考えました。
3.ドメインとの関係
だれの何を守るのか良くわかりませんが気が付いたこと。
- クロスドメイン
スクリプトは最初に開いたファイルと同じドメインにあることが前提のようです。
- 直接、パソコン内のXAMLファイルを開くと警告が出る
- 適切なMIMEタイプ
サーバーは、設定をしないと適切なMIMEタイプを付けないものらしい。
.htaccess が有効なら、
Addtype application/xaml+xml .xaml
4.利用局面
4.1.Silverlightのランタイム
SilverlightもWPFも同じ名前の名前空間のクラスを使ってプログラミングしますが、異なるものだと考えたほうが正しいようです。
Silverlightは、Silverlightのランタイムがポートされた環境ならマルチプラットフォームでブラウザを選ばず実行することが目的で、.Net Frameworkのサブセットとなっているものと思います。
ただし、サブセットと言っても、名前空間やクラスが削除されているわけではありません。概ねコーディング上は問題なく、実行時にエラーになるような制限方法になっています。
Fileアクセス、ネットワーク、描画(Pixelを直接操作するようなブラウザに機能のないもの、3D)は部分的にしか利用できません。
XAMLで記述する範囲では、描画の差異があります。
- 使えるイメージファイルが、png、jpgなどに制限される。bmpは表示できない。
- 直接XAMLの話ではないが、ビットマップのPixelの操作ができない。
- Viewport3dなど、3Dのジオメトリデータを描画できない。
- Media3D名前空間にMatrix3Dがあり、本のページを開いた感じの効果(斜めから見る感じの効果)は有効
- Colorsのメンバも圧倒的に少なくない。ただし、XAMLエディタの入力支援では、WPFと同じものが表示される。ブラウザで共通のものが、Colorsにあるものと思うが、実際にはブラウザがサポートしていて、WPFのカラーを記述して問題はないようだ。
4.2.Loose XAML
マークアップ記述だけのXAMLファイルは、ブラウザで表示できます。
直接 URL で指定して開くか、iframe タグのソースに指定します。
この場合は、.Net Framewworkが使われ、機能的な制限はありません。Viewport3Dなども利用できます。
ただし、パーミッションの制約を受けます。
XmlDataProviderを使って、公開されているWEB APIからXMLを得ようとしましたが、WebPermissionが設定されていないと言ったエラーになります。
これは、機能がないわけではないので、サーバ、クライアントに適切な設定をすれば動作させられるのだと思います。
しかし、ホームページの一部としての利用する場合には制約になることに変わりありません。
4.3.プログラミングで使う
WPFやSilverlightのプログラミングでのXAML。
4.3.1.XAMLに書くか、ビハインドコードに書くか
- 全てをXAMLマークアップでプログラミングすることはできない。
- ビハインドコードですべて記述できる。
のだと、思います。
ファイルとして、XAMLファイルにコード(C#など)を含めることはできます。
Visual Studioの都合上、自動的に作成されるXAMLファイルを使い、ビハインドコードで全て記述するのがおそらくプログラムの管理上は優れていると考えます。
ビジュアルな部分とロジックを分離すると言っても、ユーザコントロールをXAMLで参照するだけでもXAMLファイルの書き換えを生じます。
ただし、何もないところからビハインドコードで記述することは、学習方法としては無理があります。コードスニペットでXAMLを書いて、クラス名やプロパティ名を知ることは必須のことです。
4.3.2.アプリケーションを作ってみる
アプリケーションらしいものを制約のないWPFで作成して見てみます。
お菓子の虜 Web API があたので、データとして利用させていただきます。
あくまでもプログラミングの説明のためですのでご容赦を。
4.3.2.1.WPFアプリケーション

WPFアプリケーションは、特別な制限なく自身のパソコンで動作するプログラムが作れます。旧来のEXEを作る開発方法との差異は、ハードウエアやファームウエアではなく、.Net Frameworkを前提にした実行形式(CPU依存でない)が作られる点です。
まず、WPFで作ってみます。
左上に検索条件の入力用にTextBoxを置き、「検索」ボタンを付けました。(検索条件は「ひらがな」)
起動時は、「みかん」を検索した状態で表示されます。表示画面の左はListBoxで、右はイメージです。
検索後の画面操作は、XAMLで記述できます。ListBoxから製品を選ぶと、右のイメージが変わると言った処理はビハインドコードの記述なしで動作します。
検索条件として指定された文字列をURLエンコードし、再検索するためにビハインドコードを記述しました。再建策そのものは、XmlDataProviderのSourceプロパティに新たなURLをセットするだけです。これで、全て更新されます。
(1)Window1.xaml
- <Window x:Class="wpf_okashi1.Window1"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Title="WPFサンプル(お菓子検索)" Height="400" Width="640">
- <!--ListBox部分のテンプレート-->
- <Window.Resources>
- <DataTemplate x:Key="ListItemTemplate">
- <Border Margin="2" Height="100"
- BorderBrush="Blue" BorderThickness="1" CornerRadius="3">
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="100" />
- <ColumnDefinition Width="50" />
- <ColumnDefinition Width="180" />
- </Grid.ColumnDefinitions>
- <!--写真-->
- <Border Grid.Column="0" Margin="2" Background="LightYellow"
- BorderBrush="Blue" BorderThickness="1" CornerRadius="3">
- <Image Margin="2,2,2,2" Source="{Binding XPath=image}"
- Stretch="Uniform"/>
- </Border>
- <!--項目名-->
- <StackPanel Grid.Column="1">
- <TextBlock Height="20">メーカー:</TextBlock>
- <TextBlock Height="40">品名:</TextBlock>
- <TextBlock Height="20">区分:</TextBlock>
- <TextBlock Height="20">タイプ:</TextBlock>
- </StackPanel>
- <!--項目値-->
- <StackPanel Grid.Column="2">
- <TextBlock Height="20" Text="{Binding XPath=maker}"/>
- <TextBlock Height="40" Text="{Binding XPath=name}"
- TextWrapping="Wrap" FontSize="16"
- Foreground="DarkRed" />
- <TextBlock Height="20" Text="{Binding XPath=tag}"/>
- <TextBlock Height="20" Text="{Binding XPath=type}"/>
- </StackPanel>
- </Grid>
- </Border>
- </DataTemplate>
- </Window.Resources>
- <!--表示-->
- <Grid x:Name="grid1" Margin="8" Background="Tan">
- <!--データプロバイダ-->
- <Grid.DataContext>
- <XmlDataProvider x:Name="xmlDataProvider1"
- Source="http://www.sysbird.jp/toriko/api/?apikey=guest&keyword=%E3%81%BF%E3%81%8B%E3%82%93"
- XPath="okashinotoriko/item"/>
- </Grid.DataContext>
- <!--表示領域を左右分割-->
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="360" />
- <ColumnDefinition Width="*" />
- </Grid.ColumnDefinitions>
- <!--左にListBox-->
- <Grid Grid.Column="0">
- <Grid.RowDefinitions>
- <RowDefinition Height="32"/>
- <RowDefinition Height="*"/>
- </Grid.RowDefinitions>
- <!--検索条件入力-->
- <DockPanel Grid.Row="0">
- <TextBox x:Name="string_part1" FontSize="16" Width="300" KeyDown="string_part1_KeyDown" ></TextBox>
- <Button Click="Button_Click">検索</Button>
- </DockPanel>
- <!--ListBox-->
- <ListBox Grid.Row="1" ItemsSource="{Binding}"
- ItemTemplate="{DynamicResource ListItemTemplate}"
- IsSynchronizedWithCurrentItem="True" />
- </Grid>
- <!--右に大きな商品画像-->
- <Grid Grid.Column="1">
- <Grid.RowDefinitions>
- <RowDefinition Height="100"/>
- <RowDefinition Height="*"/>
- </Grid.RowDefinitions>
- <!--コメント-->
- <TextBlock Grid.Row="0" TextWrapping="Wrap" Text="{Binding XPath=comment}" />
- <!--商品画像-->
- <Image Grid.Row="1" Source="{Binding XPath=image}" Grid.Column="1" />
- </Grid>
- </Grid>
- </Window>
(2)Window1.xaml.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using System.Windows.Navigation;
- using System.Windows.Shapes;
- using System.Web;
- using System.Diagnostics;
- namespace wba_okashi1
- {
- /// <summary>
- /// Page1.xaml の相互作用ロジック
- /// </summary>
- public partial class Page1 : Page
- {
- public Page1()
- {
- InitializeComponent();
- }
- void Search()
- {
- if (string_part1.Text.Length <= 0) return;
- string url = "http://www.sysbird.jp/toriko/api/?apikey=guest&keyword=";
- url += HttpUtility.UrlEncode(string_part1.Text);//検索条件を付加
- string_part1.Text = "";
- Debug.WriteLine(url);
- xmlDataProvider1.Source = new Uri(url);
- }
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- Search();
- }
- private void string_part1_KeyDown(object sender, KeyEventArgs e)
- {
- Search();
- }
- }
- }
4.3.2.2.WPFブラウザ・アプリケーション

WPFブラウザ・アプリケーションは、ブラウザで開かれます。XAMLで指定するPageのサイズは、ブラウザのサイズを示すわけではないので、レイアウトについては多少WPFと異なることになりますが、ほとんど同じコードで動作します。
プラグインによりますが、FireFoxでも表示できます。
ブラウザで実行するプログラムなのでセキュリティの問題が生じます。
このプログラムは、XmlDataProviderを使っており、Webにアクセスします。このため、WebPermission例外が発生して、そのままでは実行できませんでした。

プロジェクトのプロパティで「セキュリティ」を選んで、WebPermissionを「必要」に設定しました。
このプログラムを、サーバーに配置すると実行できません。ローカルにしか実行できませんでした。

おそらく、特定のパソコンで実行するなら設定方法があるのだと思います。
希望は、不特定多数に見てもらうことなので、この方法は利用できないことになります。
(1)Page1.xaml
- <Page x:Class="wba_okashi1.Page1"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Title="WBAサンプル(お菓子検索)">
- <!--ListBox部分のテンプレート-->
- <Page.Resources>
- <DataTemplate x:Key="ListItemTemplate">
- <Border Margin="2" Height="100"
- BorderBrush="Blue" BorderThickness="1" CornerRadius="3">
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="100" />
- <ColumnDefinition Width="50" />
- <ColumnDefinition Width="180" />
- </Grid.ColumnDefinitions>
- <!--写真-->
- <Border Grid.Column="0" Margin="2" Background="LightYellow"
- BorderBrush="Blue" BorderThickness="1" CornerRadius="3">
- <Image Margin="2,2,2,2" Source="{Binding XPath=image}"
- Stretch="Uniform"/>
- </Border>
- <!--項目名-->
- <StackPanel Grid.Column="1">
- <TextBlock Height="20">メーカー:</TextBlock>
- <TextBlock Height="40">品名:</TextBlock>
- <TextBlock Height="20">区分:</TextBlock>
- <TextBlock Height="20">タイプ:</TextBlock>
- </StackPanel>
- <!--項目値-->
- <StackPanel Grid.Column="2">
- <TextBlock Height="20" Text="{Binding XPath=maker}"/>
- <TextBlock Height="40" Text="{Binding XPath=name}"
- TextWrapping="Wrap" FontSize="16"
- Foreground="DarkRed" />
- <TextBlock Height="20" Text="{Binding XPath=tag}"/>
- <TextBlock Height="20" Text="{Binding XPath=type}"/>
- </StackPanel>
- </Grid>
- </Border>
- </DataTemplate>
- </Page.Resources>
- <!--表示-->
- <Grid x:Name="grid1" Margin="8" Background="Tan">
- <!--データプロバイダ-->
- <Grid.DataContext>
- <XmlDataProvider x:Name="xmlDataProvider1"
- Source="http://www.sysbird.jp/toriko/api/?apikey=guest&keyword=%E3%81%BF%E3%81%8B%E3%82%93"
- XPath="okashinotoriko/item"/>
- </Grid.DataContext>
- <!--表示領域を左右分割-->
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="360" />
- <ColumnDefinition Width="*" />
- </Grid.ColumnDefinitions>
- <!--左にListBox-->
- <Grid Grid.Column="0">
- <Grid.RowDefinitions>
- <RowDefinition Height="32"/>
- <RowDefinition Height="*"/>
- </Grid.RowDefinitions>
- <!--検索条件入力-->
- <DockPanel Grid.Row="0">
- <TextBox x:Name="string_part1" FontSize="16" Width="300" KeyDown="string_part1_KeyDown" ></TextBox>
- <Button Click="Button_Click">検索</Button>
- </DockPanel>
- <!--ListBox-->
- <ListBox Grid.Row="1" ItemsSource="{Binding}"
- ItemTemplate="{DynamicResource ListItemTemplate}"
- IsSynchronizedWithCurrentItem="True" />
- </Grid>
- <!--右に大きな商品画像-->
- <Grid Grid.Column="1">
- <Grid.RowDefinitions>
- <RowDefinition Height="80"/>
- <RowDefinition Height="*"/>
- </Grid.RowDefinitions>
- <!--コメント-->
- <TextBlock Grid.Row="0" TextWrapping="Wrap" Text="{Binding XPath=comment}" />
- <!--商品画像-->
- <Image Grid.Row="1" Source="{Binding XPath=image}" Grid.Column="1" />
- </Grid>
- </Grid>
- </Page>
(2)Page1.xaml.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using System.Windows.Navigation;
- using System.Windows.Shapes;
- using System.Web;
- using System.Diagnostics;
- namespace wba_okashi1
- {
- /// <summary>
- /// Page1.xaml の相互作用ロジック
- /// </summary>
- public partial class Page1 : Page
- {
- public Page1()
- {
- InitializeComponent();
- }
- void Search()
- {
- if (string_part1.Text.Length <= 0) return;
- string url = "http://www.sysbird.jp/toriko/api/?apikey=guest&keyword=";
- url += HttpUtility.UrlEncode(string_part1.Text);//検索条件を付加
- string_part1.Text = "";
- Debug.WriteLine(url);
- xmlDataProvider1.Source = new Uri(url);
- }
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- Search();
- }
- private void string_part1_KeyDown(object sender, KeyEventArgs e)
- {
- Search();
- }
- }
- }
|