タブアイテムを非同期でロードできますか? 私の場合、私はいくつかのタブアイテムを含むタブコントロールを持っています。 ユーザーが1つのタブアイテムをクリックすると、短時間アプリケーションがフリーズしてタブアイテムが読み込まれます。TabItemを非同期でロードする
今、私はそれを変更したいと思います。ユーザーがタブアイテムをクリックすると、アニメーションが表示され、タブアイテムが完全にロードされた後、タブアイテムが表示されます。
誰かアイデア?
タブアイテムを非同期でロードできますか? 私の場合、私はいくつかのタブアイテムを含むタブコントロールを持っています。 ユーザーが1つのタブアイテムをクリックすると、短時間アプリケーションがフリーズしてタブアイテムが読み込まれます。TabItemを非同期でロードする
今、私はそれを変更したいと思います。ユーザーがタブアイテムをクリックすると、アニメーションが表示され、タブアイテムが完全にロードされた後、タブアイテムが表示されます。
誰かアイデア?
ロードに時間がかかっているかによって異なります。
データが一時停止を引き起こしている場合は、データを非同期にロードし、データのロード中にプレースホルダを表示します。データのロードが完了したら、実際の内容に変更することができます。
ここでは、一例です
あなたRelayCommand
SelectedItem
は、次のようなものに見えるかもしれません変更
<ContentControl>
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{StaticResource TabContentTemplate}" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsLoading}" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource LoadingTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
:ユーザーは、その後、かもしれない、それはロードに時間がかかっているあなたのUIなら
void ChangeTab(ITabViewModel newTab)
{
// Set loading flag and set tab as Selected
newTab.IsLoading = true;
SelectedTab = newTab;
// Create async task
var asyncTask = new Task(() => newTab.LoadData());
// This runs after task is finished running
asyncTask.ContinueWith(p => newTab.IsLoading = false));
// Start async task
asyncTask.Start();
}
を初めてタブが読み込まれたときの最初の読み込み時間に対処する必要がありますが、すでに読み込まれたタブに切り替えるときに遅れを止めることができますextending the TabControl to keep it from destorying it's TabItems。
WPFのTabControl
のデフォルトの動作は、別のタブに切り替えて戻ったときにリロードするときにTabItem
をアンロードすることです。この回避策は既に読み込まれたタブのContentPresenter
を保存し、元に戻すときに新しいタブを読み込むのではなく、保存したタブを再読み込みします。
ほとんどの場合、UI遅延は、非常に多数のUI要素が画面に表示されることによって発生します。タブ上の要素の数も減らしてみてください。たとえば、Labels
は、あなたが選択のようなラベル固有の機能ではなく、私はコメントしたいと思いますTextBlocks
は 'newTab.IsLoading = false;'に対して非同期で実行される 'newTab.LoadData()'ではありません。 (もしそうなら、 'ContinueWith Dispatcher.Invoke'は適切ではないでしょうか?)(私はTPLの方が新しいです。) –
@jbergerこれを非同期で実行する方法はたくさんありますが、すべてのコードを単一のメソッドそれを簡単に保つために。そのTPL呼び出しは、非同期呼び出しが戻ってからコードの残りの部分が終了するまで、コードの実行を停止する必要があります。私は通常、UIスレッドを使用し、通常はデータの非同期処理にバックグラウンドスレッドを使用するため、可能であれば、 'Dispatcher'をViewModelsの外に保つことを好みます。 – Rachel
だから、 'Task.Factory.StartNew'はタスクが完了するまで次の行の実行をブロックすると言っているでしょうか?または私はあなたの言葉を誤解しましたか? –
一つの
Labels
を使用しようとする必要があるので、場合を除き、TextBlocks
より多くの要素で構成されます。別のスレッドを作成してデータをロードする必要があります。 –