分類:[.NET 全般]
2022/02/26(Sat) 17:34:21 編集(投稿者)
お世話になっています。
環境はC#,VisualStudio2019,WPFです。
一秒間に60回実行するタイマーを使用し、
4秒かけてクライアント領域を塗りつぶすフェードアウト処理を実装したのですが、
塗りつぶす速度が速すぎます。
以下のソースに問題点があるか、ご指導頂けたらと思います。
private void MainWindow1_ContentRendered(object sender, EventArgs e)
{
// タイマー60FPSで始動
DispatcherTimer timer = new DispatcherTimer(DispatcherPriority.Background);
timer.Interval = TimeSpan.FromSeconds(1/60);
timer.Tick += (x, s) => { TimerActionTest(); };
this.Closing += (x, s) => { timer.Stop(); };
timer.Start();
this.FadeOut = true;
}
private void TimerActionTest()
{
// 一秒間に60回実行される
// FadeOutFlagはフィールド
if (FadeOut == true
|| FadeOutFlag == true)
{
FadeOutFlag = true;
// 要素があれば塗りつぶし。無ければ要素追加
if (fade.Children.Count == 1)
{
var rec = fade.Children[fade.Children.Count - 1] as System.Windows.Shapes.Rectangle;
// 塗りつぶし要素の大きさがクライアント領域より小さい、
// かつカウンター(一秒間に60個貯まる)が60で割って余りが0の時
if (rec.Height < this.sizeClientWinHeight
&& FadeOutNumber % 60 == 0)
{
rec.Height += this.sizeClientWinHeight / 4;
}
if (rec.Height >= this.sizeClientWinHeight)
{
FadeOut = false;
FadeOutFlag = false;
FadeOutNumber = 0;
}
}
else
{
// 要素追加
fade.IsHitTestVisible = true;
var rect = new System.Windows.Shapes.Rectangle();
rect.Width = this.sizeClientWinWidth;
rect.Height = 0;
rect.Name = "recFadeOut";
rect.Fill = System.Windows.Media.Brushes.Black;
fade.Children.Add(rect);
Canvas.SetZIndex(fade, 100);
}
// カウンター(一秒間に60回実行されるので、一秒間に60個貯まる)
FadeOutNumber += 1;
return;
}
}