Hatena::ブログ(Diary)

Yuya Yamaki’s blog このページをアンテナに追加 RSSフィード Twitter

2008年04月14日(月曜日)

Silverlight 2 Betaでフォントファイルをサーバー側からダウンロードして使用するもっとも簡単な方法

Silverlightで普通にフォント名を指定して利用できるフォントは、組み込みフォントである9種類のみとなっています。


これは基本的にSilverlight 2 Betaでも変わらないようです。

Text and Fonts | Microsoft Docs


※04/18追記※

Silverlight 2 Betaからクライアントにインストールされたフォントも指定することができるようです。その場合、フォント名は英語表記にする必要があります。

Akira Onishi’s weblog : How to set Japanese font on Silverlight 2 Beta 1:フォントを指定して日本語表示を行う時のポイント

※※※※※※※


しかしながらこれらのフォントしか使えないとなると、日本語は事実上使えないということになっていまいます。そのため、Silverlight 2 Betaから日本語はクライアントにインストールされたフォントが利用されるようになりました。これで、とりあえず何もしなくとも日本語の表示、入力は行えます。

The resource cannot be found.

TextBlock supports and uses the East Asian fonts installed on the user's machine.


f:id:Yamaki:20080414150431p:image


上記の画像はWindowsのFirefox上で確認したものですが、これを見ると変換確定前の文字が「MS UI Gothic」で、確定後の文字は「MS ゴシック」になっているようです。これらのフォントがどのように決定されているかは分かりません。フォントリンクが影響しているのか、それともダイアログフォントなどが関係するのか、はたまた固定なのか、ご存知の方がいましたら教えていただきたいと思います。


ちなみにMac OS X Leopardの場合、日本語の表示はできたものの入力はできませんでした。表示は「ヒラギノ角ゴ Pro」だと思います。こちらについてもご存知の方いましたらよろしくお願いいたします。


これらのデフォルトのフォント以外で日本語を表示、入力したいとなると、サーバー側からフォントをダウンロードするという方法になります(静的な文字の表示だけの場合にはPathに変換したものを利用する方法でも可)。

※04/18追記※

クライアントにインストールされたフォントを利用するという方法のほかに、サーバー側からフォントをダウンロードして利用するという方法があります。

※※※※※※※

ただし、「WPFアプリケーションにおけるフォントのパッケージング - Yuya Yamaki’s blog」でのフォントのパッケージングの場合同様、フォントのライセンス的に可能であることが前提となります。


Silverlight 1.0では、JavaScriptからDownloaderオブジェクトを使ってサーバー側からフォントをダウンロードすることができました。Silverlight 2 BetaからはマネージのDownloaderがなくなり、その代わりにWebClinetを使ってコンテンツをダウンロードすることができます。

Downloading Content on Demand | Microsoft Docs


しかしながら、フォントの場合にはもっと簡単にXAMLの記述だけでサーバー側からダウンロードして利用することが可能です。


XAML

<StackPanel Margin="10">
    <TextBlock FontFamily="BIZARG_.TTF#Bizareadventure" Text="/g*'y" FontSize="24" />
    <TextBlock Text="デフォルト:abcABCabcABCあいう" FontSize="24" />
    <TextBlock FontFamily="ipafont.zip#IPAGothic" Text="IPAゴシック:abcABCabcABCあいう" FontSize="24" />
    <TextBlock FontFamily="ipafont.zip#IPAPMincho" Text="IPA P明朝:abcABCabcABCあいう" FontSize="24" />
</StackPanel>


f:id:Yamaki:20080414153649p:image


上記のようなXAMLを記述し、フォントファイルはxapファイルと同じフォルダにそのまま置くか、もしくはzipファイルに圧縮して置くだけです。


最後に、冒頭に紹介したリンク先のSilvelightのFAQには下記のようなことも書かれていましたので、試してみました。

The resource cannot be found.

In addition TextBlock supports surrogate content as well as handling proper line breaking for East Asian text.


f:id:Yamaki:20080414155232p:image


サロゲートペア文字も表示可能です。ただし、デフォルトフォントではサロゲートペア文字の部分だけがなぜか「MS ゴシック」ではなくなにか別のフォントで表示されているようです。


kkamegawakkamegawa 2008/04/19 23:50 その細さはMing Liuなんでしょうね。

2008年04月11日(金曜日)

WPFとSilverlight 2 Betaで異なるコントロールの階層構造

基本的にはWPFのサブセットとなっているSilverlightのコントロールですが、その階層構造は微妙に異なっています。


WPF

f:id:Yamaki:20080411172737p:image


Silverlight 2 Beta

f:id:Yamaki:20080411172736p:image


たとえば、WPFの場合UserControlはContentControlの派生クラスですが、Silverlight 2 BetaではControlの派生クラスとなっています。また、フォント関係のプロパティについては、WPFはControlクラスで定義されているのに対して、Silverlight 2 BetaではContentControlで定義されています。


このため、WPFのUserControlではFontFamilyといったプロパティを設定することができますが、Silverlight 2 BetaのUserControlではできません。


他にも、FrameworkElementの派生クラスであるContentPresenterがControlの派生クラスになっていたり、Thumbの派生クラスであるGridSplitterがControlの派生クラスになっていたりと、異なった構造となっている部分がいくつか存在しますので、注意が必要です。


なお、Silverlight 2 Betaの詳細なコントロール階層構造については、下記のblogに掲載されている図が非常に参考になります。

Silverlight Control Hierarchy | Silverlight and other cool things ...


2008年04月09日(水曜日)

WPFにあってSilverlight 2 Betaにないシリーズ「プロパティ値の継承」

WPFでは特定のプロパティにおいて、親要素が持つ同名のプロパティ値を継承するようになっています。

プロパティ値の継承 - Yuya Yamaki’s blog

プロパティ値の継承 - MSDNライブラリ


まずはXAMLとその実行結果から見ていただきたいと思います。


XAML(WPF)

<Window x:Class="Window1"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   Title="Window1" Height="100" Width="300">
    <Grid>
        <Button FontSize="36">
            <TextBlock Text="36ポイント" />
        </Button>
    </Grid>
</Window>


f:id:Yamaki:20080409143751p:image


XAML(Silverlight)

<UserControl x:Class="SilverlightPropertyValueInheritance.Page"
   xmlns="http://schemas.microsoft.com/client/2007"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   Width="300" Height="100">
    <Grid>
        <Button FontSize="36">
            <TextBlock Text="36ポイントにはならない" />
        </Button>
    </Grid>
</UserControl>


f:id:Yamaki:20080409144353p:image


このようにWPFではButtonのFontSizeプロパティに設定した値がその子要素であるTextBlockに継承されていますが、Silverlight 2 Betaでは継承されずTextBlockのFontSizeプロパティはデフォルト値のままとなります。


そもそもSilverlightでは親要素のプロパティ値を継承する添付プロパティを作成することはできません。これはWPFとSilverlight 2 BetaのDependencyProperty.RegisterメソッドRegisterAttachedメソッドを見比べてみれば分かります。


WPF

  • RegisterAttached(String, Type, Type)
  • RegisterAttached(String, Type, Type, PropertyMetadata)
  • RegisterAttached(String, Type, Type, PropertyMetadata, ValidateValueCallback)


Silverlight 2 Beta

  • RegisterAttached(String, Type, Type, PropertyChangedCallback)


WPFのプロパティ値の継承は、FrameworkPropertyMetadataのメタデータオプションにInheritsを指定することで実現できますが、Silverlight 2 BetaではPropertyMetadataは存在しません。でもPropertyChangedCallbackはさすがに必要なので、これはRegisterメソッドの引数として指定するようになっています。プロパティの既定値、CoerceValueCallback、UpdateSourceTrigger、ValidateValueCallbackなどは指定できないようです。


2008年04月07日(月曜日)

ActiveReportsで拡張メソッド

ActiveReportsの場合、レポートデザイナのプロパティウィンドウ上ではLocationやSizeをcm単位で入力することが可能です。

f:id:Yamaki:20080407132457p:image


この設定は、メニュー[レポート]の[レポートの設定]ダイアログにある[グローバル設定]タブの[ルーラの単位]というところで変更することができます。


しかしながら、コード上でこれらのプロパティを扱う場合にはインチの単位にしなければならず、そのための静的メソッドととしてCmToInchメソッドとInchToCmメソッドが用意されています。ちょっとしたことですが、拡張メソッドを使って下記のようにしてみると少しは楽かなと思い書いてみました。


Visual Basic

Imports System.Runtime.CompilerServices
Imports DataDynamics.ActiveReports
Imports DataDynamics.ActiveReports.Document
 
Module ARExtensions
 
    <Extension()> Function Cm(ByVal inch As Single) As Single
        Return CType(inch / 2.54, Single)
    End Function
 
    <Extension()> Function WidthCm(ByVal inchSizeF As SizeF) As Single
        Return CType(inchSizeF.Width * 2.54, Single)
    End Function
 
    <Extension()> Function HeightCm(ByVal inchSizeF As SizeF) As Single
        Return CType(inchSizeF.Height * 2.54, Single)
    End Function
 
End Module
 
Public Class NewActiveReport1
 
    Private Sub Detail_Format(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Detail.Format
        Me.Label1.Width = CmToInch(3.5F)
        Me.Label1.Height = CmToInch(3.5F)
 
        Me.TextBox1.Width = 3.5F.Cm
        Me.TextBox1.Height = 3.5F.Cm
 
        Me.Label1.Text = "Width:" + Label1.Size.WidthCm.ToString() + "センチ"
        Me.TextBox1.Text = "Height:" + Label1.Size.HeightCm.ToString() + "センチ"
 
    End Sub
 
End Class


本来なら設定用はFromCmメソッド、参照用はToCmメソッドという名前が良いのかもしれませんが、できる限り短くしたかったのと、参照より設定が多いかなということで設定用をCmメソッドにして参照用はSizeF構造体の方に持っていきました。VBだと引数なしメソッドの括弧を省略できるのも、この場合はグッドです。


でもあまり変わらない・・・でしょうか。


ちなみにVisual Studio 2008対応のActiveReports for .NET 3.0Jは3/26に公開になっています。

アプリケーション開発支援ツール/コンポーネント/ライブラリ | Developer Tools - &#


2008年04月04日(金曜日)

Silverlightランタイムの動作環境

no title

上記のblogを読んであらためて気が付いたのですが、PowerPC版のMac OS XはSilverlight 1.0のみのサポートになるんですね。


:1.0と2の両方をサポート

1.0:1.0のみサポート

2:2のみサポート

×:サポート外

:存在しない動作環境


OSInternet Explorer 7Internet Explorer 6Firefox 1.5Firefox 2.0Safari
Windows Vista
Windows XP SP2
Windows 20002××
Windows Server 2003 (IA64を除く)
Mac OS X 10.4.8 以降 (PowerPC版)1.01.01.0
Mac OS X 10.4.8 以降 (Intel版)


※04/07 追記※

WindowsではSSEをサポートしたCPUが必要

デスクトップ向けCPUの場合、

Intel:Pentium III以降

AMD:Athlon XP以降

※※※※※※※※


去年リリースされたMac OS X. 10.5 LeopardはPowerPC版も存在しています。ハードウェアで考えると最後のPowerPC搭載のMacは2005年の終わり頃に発売になっていたようです。

一方で、もう7年以上前にリリースされたOSであるWindows 2000は、Internet Explorer限定ではあるものの2がサポートされます。


Silverlight 2 Betaでは、大幅な機能アップがありながらもランタイムのサイズをできる限り小さくしようというような努力が随所に見られます。それを考えるとユニバーサルバイナリによるサイズアップはやはり避けたいということなのかもしれません。


2008年04月03日(木曜日)

WPFにあってSilverlight 2 Betaにないシリーズ「スタイルの継承」と「型指定によるスタイルの適用」

いまさらながらに気がついたのですが、このシリーズは結局WPFの機能を説明することになってしまい全然Silverlightを紹介することができませんね。ただ、Silverlightにはこれとこれとこれがありませんという風に書いてもあまりおもしろくありませんので、今までこのblogで紹介していなかったWPFの機能を中心に、なんとかこのシリーズを続けていきたいと思います。


今回紹介するSilverlight 2 BetaにはないWPFの機能は、「スタイルの継承」と「型指定によるスタイルの適用」です。まずはXAMLと実行結果から先に見てもらいたいと思います。


XAML(WPF)

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="Window1" x:Name="Window" Title="Window1"
    Width="300" Height="300">
 
    <StackPanel x:Name="LayoutRoot" Orientation="Horizontal" HorizontalAlignment="Center">
        <StackPanel>
        <StackPanel.Resources>
            <Style x:Key="BaseStyle" TargetType="{x:Type Rectangle}">
                <Setter Property="Height" Value="100"/>
                <Setter Property="Width" Value="100"/>
                <Setter Property="Margin" Value="10"/>
            </Style>
            <Style x:Key="RectStyle1" TargetType="{x:Type Rectangle}" BasedOn="{StaticResource BaseStyle}">
                <Setter Property="Fill" Value="Red"/>
            </Style>
            <Style x:Key="RectStyle2" TargetType="{x:Type Rectangle}" BasedOn="{StaticResource BaseStyle}">
                <Setter Property="Fill" Value="Blue"/>
            </Style>
        </StackPanel.Resources>
            <TextBlock Text="スタイルの継承"/>
            <Rectangle Style="{StaticResource RectStyle1}"/>
            <Rectangle Style="{StaticResource RectStyle2}"/>
        </StackPanel>
 
        <Border BorderBrush="Black" BorderThickness="1"/>
 
        <StackPanel>
        <StackPanel.Resources>
            <Style x:Key="{x:Type Rectangle}" TargetType="{x:Type Rectangle}">
                <Setter Property="Height" Value="100"/>
                <Setter Property="Width" Value="100"/>
                <Setter Property="Margin" Value="10"/>
            </Style>
        </StackPanel.Resources>
            <TextBlock Text="型指定でスタイルを適用"/>
            <Rectangle Fill="Red"/>
            <Rectangle Fill="Blue"/>
        </StackPanel>
    </StackPanel>
</Window>


f:id:Yamaki:20080403115059p:image


・スタイルの継承

WPFのStyleクラスにはBasedOnプロパティが存在し、このプロパティに継承したいスタイルを指定してやることでスタイルを継承することができます。Silverlight 2 Betaにはこのプロパティがありませんので、スタイルを継承することはできません。


・指定した型すべてにスタイルを適用

WPFではスタイルのキーに型を指定してやることで、いちいちスタイルを設定しなくともすべての同じ型を持つコントロールにスタイルを適用させることができます。上記の例では、x:Key属性に"{x:Type Rectangle}"と設定していますが、TargetTypeプロパティに型を指定している場合にはx:Key属性を省略しても同じ結果を得ることができます。

Silverlight 2 Betaでは、スタイルは1つ1つStyleプロパティを使って適用するしかありません。


2008年04月02日(水曜日)

WPFにあってSilverlight 2 Betaにないシリーズ「DynamicResource」

このシリーズが続くのかどうかも定かではありませんが、WPFにはあるけれどもSilverlight 2 Betaにはないという部分を紹介していこうと思います。


まずは簡単なところからということで、DynamicResourceです。ご存知の方も多いかと思いますが、WPFにあるStaticResouceとDynamicResourceという2つのリソース参照のうち、Silverlight 2 BetaではStaticResouceのみが利用可能です。これによりどんなことができなくなっているかは、2つのリソース参照の違いを理解すれば分かります。


XAML(WPF)

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="Window1" x:Name="Window" Title="Window1"
    Width="300" Height="300">
    <Window.Resources>
        <SolidColorBrush x:Key="MyFillBrush" Color="Red"/>
    </Window.Resources>
 
    <StackPanel x:Name="LayoutRoot">
        <Rectangle Fill="{DynamicResource MyFillBrush}" Height="100" Margin="5"/>
        <Rectangle Fill="{StaticResource MyFillBrush}" Height="100" Margin="5"/>
        <Button Content="リソースの変更" x:Name="button" Click="button_Click"/>
    </StackPanel>
</Window>


Visual Basic(WPF)

Private Sub button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    Me.Resources.Clear()
    Dim newResource As New SolidColorBrush(Colors.Blue)
    Me.Resources.Add("MyFillBrush", newResource)
End Sub


上記のコードの実行結果は下記のようになります。

f:id:Yamaki:20080402145409p:image


結果を見ますと、StaticeResourceを使ったほうは色が変化しないのに対して、DynamicResouceを使ったほうは色が青色に変化しています。


この結果から、リソースの内容を動的に変更した場合にStaticeResourceの場合にはそれが反映されないと理解しがちですが、そうではありません。

ボタンのClickイベントのコードを下記の様に変更すると、StaticResorceでも色は変更されます。

Visual Basic(WPF)

Private Sub button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    CType(Me.FindResource("MyFillBrush"), SolidColorBrush).Color = Colors.Blue
End Sub


StaticResourceは、リソースキーの検索が読み込み時の一回しか行われないリソース参照です。それに対してDynamicResourceはリソースキーの検索が実行時に都度行われます。


つまり、DynamiceResourceでなければならいないというケースは、システムのテーマといったアプリケーションの外部でリソースが変更されるようなものに限られます。アプリケーション内でリソースの値を変更する場合にはStaticeResourceでも問題ありません。


ただし、StaticeResourceには読み込み時にリソースキーの検索が行われるという性質上、使用するリソースは参照する場所よりも前に定義されている必要があることだけは注意が必要です。


2008年04月01日(火曜日)

PowerToolsの歴史

@niftyを使って、PowerToolsシリーズの歴史年表を作成しました。

@nifty


f:id:Yamaki:20080401162651p:image


役に立つ類の資料ではありませんが、一部の方にはなつかしいと思っていただけると思いましたので、紹介させていただきまました。