在循环磁贴中添加文本(Windows Phone 8)

3
我在编写一个应用程序,其唯一目的是定期下载一些图像并在动态磁贴中显示它们。我想能够每隔30分钟左右更新4-8张图片的动态磁贴,因此需要使用CycleTile。下载图片并将其放入动态磁贴中非常简单。真正的难点在于在每个图像上添加文本。
如果只有两张图片,我会使用翻转磁贴,在正面和反面分别展示一张图片。然后,我会通过为正面和反面分配不同的磁贴标题来添加文本。然而,由于我需要显示超过2张的图片,所以必须使用CycleTile,而这种方法在CycleTile中无法工作。(但如果我错了,请纠正我!)
因此,我的下一个想法是在WriteableBitmap上叠加TextBlock。这可能可行,但考虑到因素如:不同的图像分辨率,中/大号磁贴布局和不同的屏幕PPI,我认为会很快变得复杂。我相信我可以想出解决方法,但它似乎有点混乱。
有更好的方法吗?我是否忽略了某些磁贴功能?
总之,我的要求是: 1.使用动态磁贴显示4-8张图片。 2.每张图片都需要与一些文本相关联。 3.每隔30分钟左右更新图片。 4.需要适应宽磁贴。 5.需要适应具有更高PPI屏幕的手机。
1个回答

4
对于第一项,您应该能够使用WriteableBitmapEx项目中的Blit方法将许多图像合并在一起。由于您可以以任何想要的方式合并图像,因此可以确保它们覆盖宽瓷砖宽度和任何所需的像素密度。
为了涵盖第二项,以下内容将在图像上叠加文本:
private static ImageSource createBitmapImageWithImage(string text, int x, int y, Color textColor, BitmapSource bitmapSource)
{
    using(var mem = new MemoryStream())
    {
        //Create Formatted Text
        var textBlock = new TextBlock
            {
                Text = text,
                Foreground = new SolidColorBrush(textColor),
                FontFamily = new FontFamily("Courier New"),
                FontSize = 40
            };

        //Moves an object two dimensionally
        var tf = new TranslateTransform
            {
                X = x,
                Y = y
            };

        //Overlay text on existing image
        var bmpImage = new WriteableBitmap(bitmapSource);
        bmpImage.Render(textBlock, tf);
        bmpImage.Invalidate();

        //Convert back into bitmap
        bmpImage.SaveJpeg(mem, bmpImage.PixelWidth, bmpImage.PixelHeight, 0, 100);
        mem.Seek(0, SeekOrigin.Begin);
        var image = new BitmapImage();
        image.SetSource(mem);

        return image;
    }
}

当然,你也可以传递文本块或配置文本块的选项。但我想展示如何以任何你想要的方式格式化文本。
你的第三个要求可以通过背景任务来解决。在你的手机解决方案中,添加一个新项目,然后选择后台任务。这很容易调用你的代码来更新图像。诺基亚甚至创建了一个步骤演示,其中包含代码示例。

太棒了!看起来正是我所需要的。谢谢caschw!随机问题...你知道"Invalidate"函数名称背后的词源吗? :) - YasharBahman
1
我能找到的最好的是 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invalidate(v=vs.110).aspx我本来不会这样命名,但当你考虑它时,它是有意义的,而不是在你第一次遇到它时。 - caschw
嗯,那个链接提供了一个非常好的描述!直到现在我才明白它的意思。谢谢! - YasharBahman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接