WPF 4 をコードで使う方法は前回で解ったので今回は XAML を。
System.Xaml が新たに作られたということは xmlns 名前空間が変わる?
というか System.Windows.Markup から書き換えも必要なのだろうか?
難しく説明しないでくれよ…
WPF の XAML 名前空間は以前と同じでイイということは解ったけど本当かな。
[XAML] WPF 4 を使用して、Windows 7 のジャンプ リストにカスタム タスクを追加する | 逆引きサンプル コード
上記とかでも 3.5 と同じだしイケそうだ。
後は IronPython で自分で書いた下記のようにソースコードに埋め込みしたいのだが。
IronPython で XAML
C# では Python の docstring みたく丸ごと XML とはいかない。
@”リテラル” で改行付き文字列はイケるけど ” を “” にする必要あり。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | using System; using System.Windows; using System.Windows.Controls; using System.Windows.Markup; class TextReader : Window { private const string TXT = @" <TextBlock xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""> Hello World </TextBlock>" ; public TextReader() { this .Title = "XamlReader.Parse Test" ; this .Width = 400; this .Height = 400; try { var tt = XamlReader.Parse(TXT) as TextBlock; this .Content = tt; tt.Text = "こんにちは日本" ; } catch (Exception e) { MessageBox.Show(e.ToString()); } } } class __main__ { [STAThread] public static void Main( string [] args) { var app = new Application(); app.Run( new TextReader()); } } |
これをビルドしても上手くいったけど XAML は通常 ” が多いし…
C# では別ファイルにして XamlReader.Load() のほうがいいな。
それと XAML から object を作ったら as で型を教えてあげないとメソッドが使えない。
IronPython は動的だからいらないけどコンパイルする C# では必須だね。
WPF 4.0 Text Stack Improvements – WPF Text Blog – Site Home – MSDN Blogs
とりあえずこの Text Rendering API ってのを試してみよう。
3.5 までは Windows XP での描写が変だったのがどうなるかだ。
私的にはもう XP はガン無視でいいけど、いつの OS だよ Linux 使えよ。
でも世間はそうじゃないし、しかたがないので XP に .NET 4.0 を入れる。
Windows Update に Client Profile ってのがあるんだね。
意外とサイズが小さいな、これなら仮想 OS な XP に入れてもいいや。
入れてみたら csc.exe なんかもしっかりあるのでコンパイルできると思う。
と思ったけど何このエラーは…
build した exe を持っていくと問題なく動くんだが、よくワカンネェ。
本当に XP って糞 OS だ、俺は XP で開発しないから無視しておこう。
てか Ubuntu 上の仮想マシンなので PC を行ったり来たりでメンドイ。
スクリーンショットも全部 Ubuntu から撮影してるし、関係無いか。
というわけでコード。
test.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | < StackPanel TextOptions.TextFormattingMode = "Display" > < TextBlock Name = "block" > クリアータイプ ... ClearType </ TextBlock > < TextBlock TextOptions.TextRenderingMode = "Grayscale" > 白黒 ... Grayscale </ TextBlock > < TextBlock TextOptions.TextRenderingMode = "Aliased" > ぎざぎざ ... Aliased </ TextBlock > </ StackPanel > |
src.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | using System; using System.IO; using System.Windows; using System.Windows.Controls; using System.Windows.Markup; class TextRender : Window { public TextRender() { this .Title = "てきすとれんだぁ!" ; this .Width = 300; this .Height = 200; try { var fs = new FileStream( "test.xaml" , FileMode.Open, FileAccess.Read); var sp = XamlReader.Load(fs) as StackPanel; this .Content = sp; (sp.FindName( "block" ) as TextBlock).MouseUp += on_click; } catch (Exception e) { MessageBox.Show(e.ToString()); } } private void on_click( object sender, RoutedEventArgs e) { MessageBox.Show( "くりっく" ); } } class __main__ { [STAThread] public static void Main( string [] args) { var app = new Application(); app.Run( new TextRender()); } } |
まとめて ZIP
textrender.zip
描写だけじゃ寂しいので一番上の文字列をクリックしたらメッセージを出すように。
ココも as で型指定が必要だ、やはり XAML をコンパイルするのとは扱いが違うわな。
うん、XP でも綺麗なフォント表示が可能になっている。
XP だと個々の差は解りにくいけど 7 でははっきり違いが解る。
しかし画像を並べてみると本当に XP の UI って古臭いなぁ…
今日はこのへんで。
追記
ビルドするためのバッチに
build32.bat
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe ^ /lib:C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF ^ /reference:System.dll ^ /reference:System.Xml.dll ^ /reference:System.Xaml.dll ^ /reference:PresentationCore.dll ^ /reference:PresentationFramework.dll ^ /reference:WindowsBase.dll ^ /target:winexe ^ /out:TextReader.exe ^ /win32icon:icon.ico ^ /optimize+ ^ src.cs PAUSE
と System.dll と System.Xml.dll への参照を追記したら XP でもビルドできた。
何で 7 と違うのよ…