如何在Windows UWP中创建Microsoft Band自定义图标 - Pages

4
我一直在尝试将自定义图标添加到填充面板中。 在文档的第8.5节中提供了一些相关信息,SDK示例演示了开发人员如何自定义磁贴的大、小图标。但是,在页面上自定义图标的操作没有清晰的示例。 进一步搜索后,我发现有一个新的Microsoft Band Tile Design Plugin适用于Visual Studio。这似乎展示了我想要实现的功能,但是当我尝试使用代码生成部分(页面中间)指定的代码时,我无法加载使用设计师创建的简单自定义布局:

enter image description here

以下是将自定义布局链接为瓷砖设计插件页面上所述的代码:

这里是将自定义布局链接为瓷砖设计插件页面上所述的代码:

try
            {
                // create a new Guid for the tile
                tileGuid = Guid.NewGuid();
                // create a new tile with a new Guid
                WriteableBitmap smallIconBitmap = new WriteableBitmap(24, 24);
                BandIcon smallIcon = smallIconBitmap.ToBandIcon();
                WriteableBitmap tileIconBitmap = new WriteableBitmap(48, 48);
                BandIcon tileIcon = tileIconBitmap.ToBandIcon();
                BandTile tile = new BandTile(tileGuid)
                {
                    // Name of the Tile
                    Name = "MyTile",
                    // Create the small and tile icons from writable bitmaps.
                    // Small icons are 24x24 pixels.
                    SmallIcon = smallIcon,
                    // Tile icons are 46x46 pixels for Microsoft Band 1, and 48x48 pixels
                    // for Microsoft Band 2.
                    TileIcon = tileIcon
                };
                var customtiledesign = new SentimentFeedbackLayout();
                tile.PageLayouts.Add(customtiledesign.Layout);
                await customtiledesign.LoadIconsAsync(tile);

                if (await bandClient.TileManager.AddTileAsync(tile))
                {
                    Debug.WriteLine("New tile added | GUID: " + tileGuid);
                }

                PageData pd = new PageData(tileGuid, 1, customtiledesign.Data.All);

                if (await bandClient.TileManager.SetPagesAsync(tileGuid, pd))
                {
                    Debug.WriteLine("Added pages");
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }

错误日志如下:
Band Connected : MSFT Band 2 bb:bc
Version: 2.0.4215.0, Hardware: 26
Band - Removing all Tiles
Removed tile: MyTile
New tile added | GUID: 4803e0fe-2da2-4efb-9389-bde3a9289d30
Exception thrown: 'Microsoft.Band.BandOperationException' in mscorlib.ni.dll
Error Device status code: 0xA0CC006A received.

我在网上找不到关于这个错误的详细信息,但我认为这是因为我使用了:

 PageData pd = new PageData(tileGuid, 1, customtiledesign.Data.All);

与其将customtiledesign.Data.All传递到...SetPagesAsync()方法中,不如采用其他方式。

这是因为没有重载的SetPageAsync形式接受PageElementData[]作为参数。


我也遇到了同样的问题,似乎没有清晰的文档来解决这个问题。 - user3596965
2个回答

1
图标在平铺布局上不可见的原因是因为在这里传递了索引1给构造函数:PageData pd = new PageData(tileGuid, 1, customtiledesign.Data.All);。应该是0。
也就是说,您的磁贴可能有几个布局,您的调用会设置第二个不存在的布局的数据。对于您添加的唯一布局,索引为0。
当您成功完成此操作时,您可能会注意到您的磁贴没有良好的图标。这是因为 smallIconBitmap 和 tileIconBitmap 在调用 ToBandIcon 之前需要某些良好的源。示例提供了以下用于加载图标的代码。
    private async Task<BandIcon> LoadIcon(string uri)
    {
        StorageFile imageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri(uri));

        using (IRandomAccessStream fileStream = await imageFile.OpenAsync(FileAccessMode.Read))
        {
            WriteableBitmap bitmap = new WriteableBitmap(1, 1);
            await bitmap.SetSourceAsync(fileStream);
            return bitmap.ToBandIcon();
        }
    }

我尝试将两个PNG文件作为图块图标加载。我认为它们的大小可能不正确。这会有影响吗?我正在使用以下方法进行加载。现在我得到了错误信息:收到0xA0D30003。 - user3596965
在更新了SDK之后,我不再遇到任何错误,但是虽然页面数据正在加载,但图标仍未显示在页面上。 - user3596965
如果笑脸图标也不起作用(即您在设计师中看到它,但在带子上看不到),那么可能是customtiledesign.LoadIconsAsync生成的设计师引用了资源,但在调用该方法时该资源不可用。理论上,该方法应该引发异常,但我不确定。 - AndrewGa MSFT Band SDK
如果你证明了LoadIcons调用没有正确加载资源,那么可以尝试调整图标加载算法。生成的SentimetFeedbackLayout类上有AdjustURIMethod和LoadIconMethod属性。 - AndrewGa MSFT Band SDK
抱歉需要澄清一下,我正在使用Xamarin,但手环代码在UWP项目中。 - user3596965
显示剩余6条评论

0
请尝试在调用AddTileAsync之前调用LoadIconsAsync(翻转下面代码片段中的行)。这很可能是原因,我刚刚验证了一下。在我们为设计师编写的文档中,有两个示例代码片段。第一个是不正确的。它调用了您在发布到MSDN论坛的代码版本中尝试的方式。第二个示例是正确的。我们将尽快修复文档。对此我们深感抱歉。
在这个特定问题中呈现的代码片段是正确的,但在MSDN问题中呈现的代码片段却翻转了行。AddTilesAsync在LoadIconsAsync之前。
还请注意,在编写实现IBackgroundTask对象的应用程序服务时,建议使用带有True参数的GetBandsAsync进行Windows Phone 10开发。这与从非UI工作线程调用异步代码不同。

我已尝试过前后的代码行,但不幸的是都无法正常工作。 - user3596965
我能想到的唯一问题就是我在使用Xamarin,我已经将控制器放入了UWP项目文件夹中。 - user3596965
我们还没有尝试在Xamarin的环境下使用设计师。首先,我们想了解市场需求。但是你声称你的Band SDK代码在UWP项目中。因此,这里是一个包含UWP解决方案的zip文件链接。该解决方案包含设计布局和消耗它的代码。它在我的设备上百分之百地工作。请查看它,编译并尝试在您的手机上运行以查看是否有效。 - AndrewGa MSFT Band SDK
按下回车键过早。如果它可行,请尝试在我的项目中精确使用您的图标并查看是否仍然工作。如果它停止显示图标,则我们可以讨论格式。如果它能够使用您的图标,请尝试查看您的项目和我的项目之间的任何区别。https://onedrive.live.com/redir?resid=4D46F45362D3AA5!56464&authkey=!AJ89-_KOJ2pmBCg&ithint=file%2czip - AndrewGa MSFT Band SDK
解决了! :) 由于某种原因,我需要使用Guid.NewGuid()生成一个新的GUID。 - user3596965

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