たこぜりー研究室

大腸菌DNAは4.64Mbp。酵母は13Mbpで、ヒトは3Gbp

スポンサーサイト

#
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

WPF で Windows Forms 的なローカライズ

#468
<Button Content="{x:Static clr:Res.Message}" />

こんな感じでいけます (clr は自動生成されたリソースクラスがある名前空間へのマッピングね) 。
これで x:Uid 使わなくてもローカライズ。

だけど、これパフォーマンス的にどうなんだろ。
リフレクションを使っていたら、「パフォーマンスの最適化 : データ バインディング」で指摘されていることが同じようにあてはまる気がする。
スポンサーサイト

WPF コンバータ

#466
今日は IValueConverter ってやつをようやく満足に動かすことができた。
満足、満足、と思っていたが、よくよく見直してみると、RenderTransform プロパティに TranslateTransform を叩き込めばいいだけの話だったことに気付いて、絶望した!!

3 次ベジェ曲線を XAML で

#460
3 次ベジェ曲線のパラメータ表示は、

p(t) = (1 - t)^3 * p0 + 3t (1 - t)^2 * p1 + 3t^2 (1 - t) * p2 + t^3 * p3

ですが、これを 0 ≦ t ≦ 1 で動かす様子を XAML で!
と思ったのだが、どうやら Loose XAML では厳しそうとの結論。

10 個の Point を用意。各 Point 間を結ぶ直線を表現するのに、LineSegment.Point などに各 Point をバインディングするところまでは OK 。

最初の 1 次のところは PointAnimation の線形補間で実現できるので、ここもコード不要。
だがこのさき、2 次、3 次は線形補間ではだめで、PointAnimationUsingPath がうまくいかない。
2 次はうまくいっているように見えるが、実際には速度が間違っていて、3 次になったときにずれていることが判明する。
(当然と言えばそうかもしれんが気づくのに時間がかかった)


で結局、コードを書くことに。
2 次・3 次は Storyboard.CurrentTimeInvalidated イベントにひっかけて動かし、パラメータ t の値は Storyboard を Clock にキャストし、Clock.CurrentProgress から取得。

完成品 :

3 次ベジェ曲線
ちゃんと青線が赤線の接線になっている、はず。

なお、比較 → Wikipedia

数値積分

#458
プログラム中で 3 次ベジェ曲線の長さを求める必要が出てきたのでメモ。

これも WPF なら余裕。描画なら XAML で BezierSegment とか。
長さの計算も一応 60 行ぐらい。

数値積分は区分求積法ではつまらんので、シンプソンの公式などを Wikipedia で復習 (というか、ほとんど新規学習) 。

で非積分関数部分だが、3 次ベジェ曲線の関数は簡単に 2 次元ベクトル関数で表せるので、ひたすら double の掛け算をごりごり書く必要はなく、たとえば内積ならば

Vector * Vector

で OK 。Point から Vector は Point - new Point() で。

自分同士の内積、つまりベクトルの大きさの二乗は Vector.LengthSquared でいけます。
やってることは同じだが、ソースコードはすっきり。

参考 : ニュートン・コーツの公式 [Wikipedia]

XBAP でのファイル アップロード

#457
XAML ブラウザ アプリケーションで画像をアップロードして、表示するようなとき。

単純に OpenFileDialog.FileName からいくと、FileIOPermission を要求されて XBAP ではアウト。

その場合は、OpenFileDialog.OpenFile() : Stream で。
これは FileDialogPermission ですが、XBAP でも通ります。

参考 : XBAP からの安全なファイルのアップロードのサンプル [MSDN Library]

コレクション要素へのバインディング パス

#456
最近の動向としては、せっかくの Web アプリケーション作成の機会、XAML を推していく方向です。

そのなかでの学習事項その 1 。

コレクションというか ObservableCollection を (ListView.ItemsSource とかではなく) Page.DataContext にバインディングして、個々のインデックスに入っている Point にパスをもっていくとき。
最初は Path=Item(0) のようにしなきゃダメかと思ったが失敗。

単純に Path=[0] のように C# のインデクサの書き方で通るのであった。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。