2008/06/15

XAML でのアニメーション

XAMLのアニメーションについて分かったことをまとめる。

(1)
アニメーションには TargetProperty の型ごとに種類がある。
 DoubleAnimation : 型がDouble用
 SingleAnimation : 型がSingle用
 Int32Animation : 型がInt32用
 Int16Animation : 型がInt16用
 ColorAnimation : 型がColor用

基本的な型に対してこれ以外にも同様に存在する。

これらは AnimationTimeline を継承しているので
以下、各型に対するアニメーションの総称として
AnimationTimeline を用いる。

(1)
AnimationTimeline を管理するオブジェクトは<BeginStoryboard>である。
これが DoubleAnimation 等で指定する TargetProperty とリンクする。

リンク前の値を AnimationTimeline は憶えていて、
AnimationTimeline が破棄されると TargetProperty は元の値に戻る。

(2)
AnimationTimeline の FillBehavior に "HoldEnd" が指定されていると、
アニメーションが終わっても TargetProperty の値は最後の値が保持される。

"Stop"が指定されていると、アニメーションが終わると
該当する AnimationTimeline が破棄され TargetProperty は元の値に戻る。

デフォルトは"HoldEnd"

(3)
同じプロパティに対してEventTrigger と DataTrigger の両方を
設定し、さらにどちらにも FillBehavior="HoldEnd" としておくと、
EventTrigger の AnimationTimeline が優先される。

一度 EventTrigger によるアニメーションが発生すると、
そのままでは DataTrigger の AnimationTimeline は実行されない。

EventTrigger同士であれば、AnimationTimeline は
新しいものに書き換えられる。

(4)
EventTrigger によるアニメーション実行後に同じ TargetProperty に対して
DataTrigger によるアニメーションを有効に機能させるには、EventTrigger による
アニメーションを StopStoryboard によって破棄する必要がある。


具体的には次のようにすれば EventTrigger と DataTrigger が共存できる。

<EventTrigger RoutedEvent="Mouse.MouseEnter">
<BeginStoryboard Name="Test1">
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
To="1.0" Duration="0:0:1"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<DataTrigger Binding="{Binding XPath=@AAA}" Value="XXX">
<DataTrigger.EnterActions>
<StopStoryboard BeginStoryboardName="Test1"/>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
To="0.5" Duration="0:0:1"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>

2008/06/07

ListBoxでのホイールイベント (XAML)

マウスホイールのイベントをListBoxで取得するには、
  MouseWheel
ではなく
  PreviewMouseWheel
を使う。

MouseWheelはボタンなど他のコントロールでは有効だが、
ListBoxに関してはなぜか反応しないためである。


具体的には、
<ListBox Width="100" Height="100"
PreviewMouseWheel="MouseWheelHandler">
<ListBoxItem Content="AAA" />
<ListBoxItem Content="BBB" />
</ListBox>

のようにする。MouseWheelHandlerはC#で次のようなものを書けばよい。
private void MouseWheelHandler(object sender,
MouseWheelEventArgs e)
{
if(e.Delta > 0)
{
//前方に回転
}
if(e.Delta < 0)
{
//後方に回転
}
}

2008/06/03

ガソリン価格

街中のガソリンスタンドの価格を見てると、
ガソリン価格がどんどん上がっている。
店頭で1Lあたり170円くらいかな?
このまま行くと200円を超えそうだ。

でも、もっともっと上がればいい。
そうすればCO2の排出量が減って長期的には環境にはよいだろう。
市場原理で環境負荷が下がるなんて、なんてうまいシステムなんだ。

さらに毎年ガソリン税を上げていったほうがいいのではないだろうか。
加速度的に環境負荷を下げれるかもしれない。

今のシステムorフレームワークで商売をしている人たちには痛い話かもしれんが、
新しく台頭してくる企業もあるだろう。

車の使用コストが上がると、車がないと生活できない田舎が問題になる。
これは解決が難しいかもしれない。