1

私は、選択したオブジェクトが 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;
        });
4

2 に答える 2

0

コードの再現がなければ、何が問題なのかはわかりませんが、あなたのアプローチには根本的に問題はありません。

以下の作品:

  • 新しい空のユニバーサル アプリを作成します。
  • 両方のターゲット間で MainPage を共有する
  • この XAML を追加します。

    <StackPanel>
        <TextBlock>Some text</TextBlock>
        <Button Click="ChangeColor_OnClick">change color</Button>
        <ListBox x:Name="ListBox">
            <ListBoxItem>item 1</ListBoxItem>
            <ListBoxItem>item 2</ListBoxItem>
            <ListBoxItem>item 3</ListBoxItem>
        </ListBox>
    
        <Button Click="TakeScreenshot_OnClick">take screenshot</Button>
        <Button Click="TakeScreenshotOfSelected_OnClick">take screenshot of just selected item</Button>
        <Image x:Name="DisplayedScreenshot" Height="200" />
    </StackPanel>
    
  • このコード ビハインドを追加します。

    private void ChangeColor_OnClick(object sender, RoutedEventArgs e)
    {
        var rand = new Random();
    
        this.Background = new SolidColorBrush(new Color { A = 255, R = (byte)rand.Next(1, 255), G = (byte)rand.Next(1, 255), B = (byte)rand.Next(1, 255) });
    }
    
    private async void TakeScreenshot_OnClick(object sender, RoutedEventArgs e)
    {
        RenderTargetBitmap rtb = new RenderTargetBitmap();
    
        await rtb.RenderAsync(this as FrameworkElement);
    
        this.DisplayedScreenshot.Source = rtb;
    }
    
    private async void TakeScreenshotOfSelected_OnClick(object sender, RoutedEventArgs e)
    {
        RenderTargetBitmap rtb = new RenderTargetBitmap();
    
        await rtb.RenderAsync(this.ListBox.SelectedItem as UIElement);
    
        this.DisplayedScreenshot.Source = rtb;
    }
    
于 2014-12-17T12:34:14.813 に答える