ボタンをクリックすると完了するまでに約 5 秒かかる関数があります。ボタンがクリックされた場合、ボタンクリックが処理されていることを示す何らかの通知を表示したいと思います。
<Button Click="OnButtonClick" Content="Process Input" />
<Border x:Name="NotificationBorder" Opacity="0" IsHitTestVisible="False"
Width="500" Height="100" Background="White">
<TextBlock Text="Your input is being processed" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
そして、ボタンクリックのコードビハインドで:
private void OnButtonClick(Object sender, RoutedEventArgs e)
{
DoubleAnimation da = new DoubleAnimation
{
From = 5,
To = 0,
Duration = TimeSpan.FromSeconds(2.5),
};
// Making border visible in hopes that it's drawn before animation kicks in
NotificationBorder.Opacity = 1;
da.Completed += (o, args) => NotificationBorder.Opacity = 0;
NotificationBorder.UpdateLayout(); //Doesn't do anything
UpdateLayout(); // Doesn't do anything
NotificationBorder.BeginAnimation(OpacityProperty, da);
// Simulate calculationheavy functioncall
Thread.Sleep(5000);
}
どういうわけかUpdateLayout()
レンダリングが十分に速くないため、通知は 5 秒が経過した後にのみ表示されThread.Sleep
ます。
Dispatcher.Invoke((Action)(() => NotificationBorder.Opacity = 1), DispatcherPriority.Render);
どちらも機能しません。
さらに、別のワーカー スレッドで実行することはできませんThread.Sleep
。実際のアプリケーションでは、Dispatcher が所有するオブジェクトからデータを読み取り、UI の一部を (再) 構築する必要があります。
Thread.Sleep()
が呼び出される前に表示する方法はありますか?