4

ライブ タイルを使用して Windows 8 ストア アプリを作成しています。すべてのライブ タイルは、 x分ごとに更新する必要がある画像です。タイム トリガーを使用してバックグラウンド タスクを使用して、画像を生成し、タイルを更新しています。

イメージを生成するということは、新しいイメージを作成してその上にペイントすることを意味しますが、WriteableBitmap の新しいインスタンスを作成しようとすると、何らかの理由で例外が発生します。

var newImage = new Windows.UI.Xaml.Media.Imaging.WriteableBitmap(10, 10);

また

var newImage = BitmapFactory.New(10, 10);

この例外をスローします:

アプリケーションは、別のスレッド用にマーシャリングされたインターフェースを呼び出しました。(HRESULT からの例外: 0x8001010E (RPC_E_WRONG_THREAD))

これは、バックグラウンド タスクに UI スレッドがないためだと思いますが、なぜ WriteableBitmap に UI スレッドが必要なのですか?

これを回避する方法はありますか?バックグラウンド タスクで WriteableBitmap をインスタンス化するにはどうすればよいですか?

4

3 に答える 3

1

これは、Windows 8 では不可能であることがわかりました。

それは、 XamlBackgroundTaskを介して、その後のバージョンの Win 8.1 と UWP で可能になりました。

于 2016-06-20T14:04:34.157 に答える
-1

次のコードは引き続き使用できます。

 CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
            () =>{
                // Your UI update code goes here!
                WriteableBitmap writeableBmp = BitmapFactory.New(imageWidth, imageHeight);
            });

しかし、ほとんどの場合、次のような別の例外 (InvalidOperationException) が発生します。メソッドが予期しない時間に呼び出されました。WinRT 情報: メイン ウィンドウがまだ作成されていないため、新しいビューを作成できませんでした。

于 2013-10-16T14:40:04.947 に答える
-1

使用できますDispatcher

Application.Current.Dispatcher.Invoke(
    DispatcherPriority.Normal,
    new Action(() => createBitmap)
);

アップデート

Dispatcher.RunAsync
    (CoreDispatcherPriority.Normal, 
    () => new WriteableBitmap(10, 10));
于 2012-11-11T06:12:23.017 に答える