ImageTools仅在某些条件下成功创建PNG

时间:2013-06-19 14:37:43

标签: vb.net windows-phone

我正在尝试使用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

正如您所看到的,正在执行的代码是相同的,但是当我直接在我的构造函数中运行它时,与从按钮单击处理程序运行它相比,我得到的结果不同。

目标是在运行时生成这些图像(无需用户进行任何交互)。

我已经尝试了一些不同的方法,但我总是得到相同的结果 - 当应该有文本+图像时,只用文本生成图像。我在其他应用程序中使用相同的方法,唯一的区别是应用程序启动时其他应用程序没有创建图像,这可能是问题。

如果我更改用于构建图像的控件的位置/类型,它似乎也没有什么区别。

1 个答案:

答案 0 :(得分:1)

根据您的评论,尝试稍后在加载序列中调用您的方法或使用:

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

这将使函数排队在下一个UI线程标记上运行,该标记应该在排队的任何待处理布局工作之后。

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

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

相关问题