0

ImageTools を使用して画像を生成しようとしていますが、コードが機能し、画像が正常に作成されます...ただし、画像を作成する前にユーザー入力がある場合のみ!

たとえば、新しいサブで画像を生成しようとすると、画像が作成されますが、画像ではなく、キャンバスのテキスト ボックス コントロールのみが含まれます (私のコントロールはテキスト + 画像で構成されます)。画像は作成されていますが、部分的なコンテンツしかレンダリングしていません。

ページにボタンを配置し、ボタン クリック イベント ハンドラーから画像を生成すると、画像は正しく生成されます。

それで、私はここで何が間違っていますか?また、ユーザー入力なしで (つまり、アプリの起動時に) 画像を生成するにはどうすればよいですか?

ImageTools、FWIW の代わりに WriteableBitmap を使用してもまったく同じ結果が得られます。

キャンバスとテキスト/画像要素を使用してスタックパネルを作成し、標準コードを使用して分離ストレージ内のファイルに画像をレンダリングします。ユーザー入力後にすべてが完全に機能するため、コードのどの部分を提供すればよいかわかりません...基本的には変更されていないサンプルコードを使用しています。

コード部分 (これはすべて私の MainPage.XAML.VB にあります):

  Public Sub New()
    InitializeComponent()

    ' some code commented out while debugging - not relevant here

    SetupHubTiles() ' this is the method that sets up the images (see below)
End Sub

SetupHubTiles メソッドは、次のメソッドに対して複数の呼び出しを行います。

  Public Sub CreateHubTile(background As StackPanel, tileImage As String, tiletoupdate As HubTile)

    Dim isoStoreTileImage = String.Format("isostore:{0}", tileImage)

    'Create a bitmapImage to IsolatedStorage.
    Using store As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication()
        'Tile image's Height * Width are 173 * 173.
        Dim bitmap = New WriteableBitmap(173, 173)

        'Render a bitmap from StackPanel.
        bitmap.Render(background, New TranslateTransform())
        Dim stream = store.CreateFile(tileImage)
        bitmap.Invalidate()
        bitmap.SaveJpeg(stream, 173, 173, 0, 100)

        stream.Close()

    End Using

    SetHubTileImage(tileImage, tiletoupdate) ' this is what sets a control on the MainPage to display the generated image

End Sub

最後に、ボタン クリック ハンドラー (使用しているコードが別のアプリで正常に動作するため、実装したばかりですが、そのアプリは画像を作成する前に常にユーザー入力を取得するため、2 つのアプリの唯一の違いであると考えました)

  Private Sub StartButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles StartButton.Click

    SetupHubTiles()

End Sub

ご覧のとおり、実行されるコードは同じですが、コンストラクターで直接実行すると、ボタン クリック ハンドラーから実行する場合とは異なる結果が得られます。

目標は、これらの画像を実行時に (ユーザーの操作なしで) 生成して UI で使用することです。

これを行うためにいくつかの異なる方法を試しましたが、常に同じ結果が得られます。テキストと画像があるはずなのに、テキストだけで画像が生成されます。他のアプリでも同じ方法を使用していますが、唯一の違いは、他のアプリがアプリの起動後すぐに画像を作成しないことです。これが問題になる可能性があります。

イメージの作成に使用しているコントロールの場所/タイプを変更しても、違いはないようです。

4

1 に答える 1

1

コメントに基づいて、読み込みシーケンスの後半でメソッドを呼び出すか、次を使用してみてください。

Dispatcher.BeginInvoke(() => { GenerateImages(); });

これにより、キューに入れられた保留中のレイアウト作業の後にある次の UI スレッド ティックで実行される関数がキューに入れられます。

コンストラクターの最後でこの関数を呼び出しているという事実は、(異なるオブジェクトを表す変数が初期化されているという事実を除いて) 何の影響もありません。StackPanelレイアウトが開始される前に、すべて同じ UI スレッド ティックで発生しているため、キャプチャするものは何もありません。

これを修正するには、コードをLoadedページのイベントに追加し、Dispatcher.BeginInvoke呼び出しでラップして、すべてのコントロールがレンダリングされた後に発生することが保証されるようにします (少なくとも最初のパスでは、起動シーケンス)。

于 2013-06-20T04:20:53.617 に答える