- 2009-03-22 (日) 9:17
- Programming
描画領域を取得したい場合は、 RenderSize が使える。以下は、コンテンツが 590×450になるようにウィンドウサイズを変更する例。
private void buttonAdjustWindowSize_Click(
object sender, RoutedEventArgs e)
{
Width -= (grid.RenderSize.Width - 590);
Height -= (grid.RenderSize.Height - 450);
}
Window -> grid -> その他もろもろ といった感じにコントロールを配置しているので、grid の大きさが、いわば Form アプリの ClientRect() に相当する感じになっているので、それを利用してみた。
まぁ、API でガリガリとウィンドウ枠の幅を取得しても良かったんだけど、めんどくさいしね。
スレッドを走らせて、そこから WPFコントロール のプロパティにアクセスする例。
void StoreBijinClockPhoto()
{
/*... Get photo and save to "filename"... */
Dispatcher.BeginInvoke(
new SetSourceToImageDelegate(SetSourceToImage));
// Invoke(new SetSourceToImageDelegate(SetSourceToImage));
}
delegate void SetSourceToImageDelegate();
void SetSourceToImage()
{
image.Source = new BitmapImage(new Uri(filename));
DoubleAnimation animation = new DoubleAnimation();
animation.From = 0;
animation.To = 1;
animation.Duration = TimeSpan.FromSeconds(3);
image.BeginAnimation(OpacityProperty, animation);
}
Invoke() が使えないのでどうするんだ…と思ったが、Dispatcher.BeginInvoke() というものがあるんだそうな。
SetSourceToImage() の後半はアニメーションの例。
複数の animation を同時に扱いには ストーリーボード を利用するのだそうな。
ここでは、 image(Imageコントロール)の Opacity(Double型)を0から1へ3秒かけて増やしていくアニメーションを作成している。Double型をいじりたいので、DoubleAnimation を生成、それに From, To, Duration を設定し、image.BeginAnimation で、作成したanimationをOpacityに割り当てる。
これで、image に画像を割り当てた時に、もわーっと画像が現れるエフェクトを作成できる。応用すれば、画像がくるくる縮小・拡大して切り替わるとか、画像が右に消えて左から新しい画像が現れるとか、まぁ、そんな切り替えエフェクトが簡単にできそうだよね。
WPF のウィンドウって枠が消せないのかなぁ…。WindowStyle を None にしてもだめだわ…。ま、気長に悩みますか。
今日は少しお出かけしてきます。んじゃね。
- Newer: WPFで美人時計作ってみた。
- Older: [今日の名言] 我々の間には「チームプレイ」などという都合のいい言い訳は存在せん

