さてさて 謎のConverter

#wpdev_jp #wp8jp

さて、この Converter は何?

まずは Converter のソースから。

 public class Converter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
        string language)
    {
        return ((double)value + 90.0);
    }

    public object ConvertBack(object value, Type targetType, object parameter, 
        string language)
    {
        throw new NotImplementedException();
    }
}
  

見るとわかりますが、入力値に90を足して出力するだけの Coverter です。Converter なのでデータバインドのために使います。では何に使うのか?

... ちなみに、それぞれの関数の最後が string language となっていますがこれはWinRT用。WP用は CultureInfo ですね。

では、私がやりたかったことを。

厚みのある四角を回転させたい

オブジェクトの変換の中のProjection を使えば、X,Y,Z 各軸を中心とした疑似3次元の回転を行うことができます。しかし、この際奥行きがないんです。なので回しても立体感がない

image

そこで、面の端にもう一枚四角を配置することにした。横の面である。前面に対して90°回転させた状態で配置する。ここでは分かりやすいように 75°くらいにしておく。

image image

これで全体をGridでグループ化して回してみよう。

image image

なんかよさげ... あれ?回転が進むにつれて鋭角に。... そう、3つの絵の細い四角の角度は変わっていない。(たとえばスクリーンを基準にして)全体が回転しても、細い四角の角度はスクリーンに対して変わってないのだ。

図にして上から見るとこんな感じ。自然に角度を変えるには、全体の回転角+90°としなければならない。

image

そう、常に変化に対して値を変えて反映する。データバインドを使えばいい。しかし入力値に90°を足さないといけない。だから Converter である。

ということで先ほどは固定値にした75°(ほんとは90°)のところを全体のパネルの Projection RotateY と紐づける。その際に Converter 喪設定する。

image

image image imageimage

こんな感じでさっきよりも自然に傾いているが、それも30°くらいまで。それ以上行くとなぜかおかしい。90°近くではほぼ平面になってる。

多分この辺は Grid の回転時の描画と、Perspective 3Dの描画方法によるものではないかと勝手にあきらめた。まぁ、±30度くらいは使えるので何かに使うこともあるかと。

Converter や Behavior(WinRTにはないが) を使って、コードレスのUI拡張をしていきましょうね。