0

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());
}
4

1 に答える 1