0

我正在尝试使用 ImageTools 生成图像,并且我的代码可以正常工作并成功创建图像……但前提是我在尝试创建图像之前有用户输入!

例如,如果我尝试在 New sub 中生成图像,则会创建图像,但它们仅包含画布中的文本框控件而不包含图像(我的控件由文本 + 图像组成)。所以正在创建图像......但它只呈现部分内容。

如果我在我的页面上放置一个按钮并从按钮单击甚至处理程序生成我的图像,则图像会正确生成。

那么我在这里做错了什么?以及如何在没有用户输入的情况下生成我的图像(即应用程序启动时)。

我使用 WriteableBitmap 代替 ImageTools,FWIW 得到了完全相同的结果。

我使用画布和我的文本/图像元素创建堆栈面板,然后使用标准代码将图像渲染到独立存储中的文件。由于在用户输入后一切正常,我不知道要提供代码的哪些部分......我基本上使用的是未经修改的示例代码。

代码部分(这都在我的 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

最后是按钮单击处理程序(我刚刚实现了它,因为我使用的代码在另一个应用程序中运行良好,但该应用程序总是在创建图像之前获取用户输入,所以我认为这是两个应用程序之间的唯一区别)

  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 线程滴答声上运行,该滴答声应该在排队的任何未决布局工作之后。

您在构造函数末尾调用此函数这一事实没有任何后果(除了表示不同对象的变量已被初始化的事实)。这一切都发生在同一个 UI 线程滴答中,在 Layout 启动之前,因此没有任何内容StackPanel可供您捕获。

要解决此问题,请将您的代码添加到LoadedPage 的事件中并仍然将其包装在一个Dispatcher.BeginInvoke调用中,以便保证在您的所有控件都呈现之后发生(至少它们的第一次传递,而不是承受之后加载的任何内容)启动顺序)。

于 2013-06-20T04:20:53.617 回答