私は、選択したオブジェクトが SettingsFlyout 内から画面上の新しい場所に移動する派手なアニメーションを表示できるように、選択範囲からビットマップを生成しようとしているユニバーサル アプリに取り組んでいます。リストビューは「詳細」ビューに移行されます。
このコードが他の場所で提案されているのを見たことがありますが、うまくいかないようです。System.ArgumentException の後に「値が期待される範囲内に収まりません」というメッセージが表示されます。RenderAsync 呼び出しで。なぜそれが起こっているのですか?コードをステップ実行すると、ListViewItem が適切に検出されていることがわかりますが、レンダリングは機能しません。ItemContainerGenerator について別の言及を見ましたが、NullReferenceException が生成されました。
private async void AnimateSelection(object sender, SelectionChangedEventArgs e)
{
var container =
(sender as ListView).ContainerFromItem((sender as ListView).SelectedItem);
var bitmap = new RenderTargetBitmap();
await bitmap.RenderAsync(container as FrameworkElement);
// go on to animate this by copying it to another grid
}
誰もこれを前に試しましたか?私がやりたいことは、リストビューの選択した項目を単純にコピーして、別のグリッドで使用することです。詳細について質問を編集する必要がある場合はお知らせください。
編集:別の dev からの提案により、同じページから pageRoot スタックパネルと別の TextBox をレンダリングしようとしましたが、それも失敗しました。問題はレンダリング自体にあると思います-このコードを別のものに置き換えることはできますか?
var bitmap = new RenderTargetBitmap();
await bitmap.RenderAsync(container as FrameworkElement);
編集:開発者は、ディスパッチャーが問題になる可能性があることを示唆しました.ユニバーサルアプリではディスパッチャーの処理が異なることが判明したため、それを使用してみました-変更なし
var container =
(sender as ListView).ContainerFromItem((sender as ListView).SelectedItem);
await this.dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
var bitmap = new RenderTargetBitmap();
await bitmap.RenderAsync(container as FrameworkElement);
var vm = this.DataContext as PersonViewModel;
vm.TransitionImageSource = bitmap;
});