1 ~ 20 秒かかる「データの読み込み」プロセスがあるため、ウィンドウにステータス メッセージを表示したいと考えています。ウィンドウ グリッドには、ビュー モデルにバインドされたトリガーに基づいて表示または非表示になる行があります。これはうまくいきます。私の問題は、バインディングを変更して、長時間実行されるタスクが開始される前に UI を更新する方法です。ここで、Status プロパティが設定されてからタスクを開始しましたが、タスクが完了するまで UI が更新されません。これが私のxamlとビューモデルのコードです。
<Grid Grid.Row="4" Background="{StaticResource appPrimaryBackColorLight}" Height="20">
<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
<DataTrigger Binding="{Binding StatusMessageVisibility}" Value="Collapsed">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Height" From="20" To="0" Duration="0:0:0.1" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Height" From="0" To="20" Duration="0:0:.1" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<Image Width="20" Height="20" Grid.RowSpan="2" ani:ImageBehavior.AnimatedSource="/Images/spinner_status_20.gif"></Image>
<TextBlock Text="{Binding StatusMessage}" Height="20" VerticalAlignment="Center" Padding="5,1,0,0" Style="{StaticResource appTextBlockSmallDark}" Foreground="White" />
</StackPanel>
</Grid>
private void LoadImportData()
{
// Show the status message by changing the view model properties
StatusMessage = "Loading data from import file. Please stand by...";
StatusMessageVisibility = Visibility.Visible;
Task.Factory.StartNew(() =>
{
//This invokes UI specific code inside module initialization
LoadDataNow();
}, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.FromCurrentSynchronizationContext());
}