Сегодня я наконец-то прибил очень странную проблему в Microsoft Band SDK — или, собственно, мое понимание этого. Для моего текущего исследовательского проекта я создаю пользовательский интерфейс на своей группе Microsoft. Я должен содержать две панели: одна с текстом, значком и кнопкой, а вторая — с двумя текстами. Подробности о том, как настроить что-то подобное, можно найти в образцах группы .
Создание пользовательского интерфейса группы не для слабонервных, оно включает в себя создание пользовательского интерфейса из кода без какого-либо дизайнера. Заполнение этих элементов пользовательского интерфейса значением — это отдельный шаг, который содержит довольно много ошибок, которые вы не можете извлечь из примеров.
Код создания пользовательского интерфейса моей группы выглядит так:
private IEnumerable<PageLayout> BuildTileUi()
{
var bandUi = new List<PageLayout>();
var page1Elements = new List<PageElement>
{
new Icon {ElementId = IconId, Rect = new PageRect(60,10,24,24)},
new TextBlock {ElementId = TextTemperatureId, Rect = new PageRect(90, 10, 50, 40)},
new TextButton {ElementId = ButtonToggleFanId, Rect = new PageRect(10, 50, 220, 40),
HorizontalAlignment = HorizontalAlignment.Center}
};
var firstPanel = new FilledPanel(page1Elements) { Rect = new PageRect(0, 0, 240, 150) };
var page2Elements = new List<PageElement>
{
new TextBlock {ElementId = TextTimeId, Rect = new PageRect(10, 10, 220, 40)},
new TextBlock {ElementId = TextDateId, Rect = new PageRect(10, 58, 220, 40)}
};
var secondPanel = new FilledPanel(page2Elements) { Rect = new PageRect(0, 0, 240, 150) };
bandUi.Add(new PageLayout(firstPanel));
bandUi.Add(new PageLayout(secondPanel));
return bandUi;
}
Это довольно горстка, верно? Затем для установки значений для этого элемента пользовательского интерфейса у меня был маленький кусочек кода:
private List<PageData> BuildTileData1(string timeText,
string dateText,
string temperature,
string buttonText)
{
var result = new List<PageData>
{
new PageData(Page2Id, 1,
new TextBlockData(TextTimeId, timeText)),
new PageData(Page2Id, 1,
new TextBlockData(TextDateId, dateText)),
new PageData(Page1Id, 0, new IconData(IconId, 1)),
new PageData(Page1Id, 0,
new TextBlockData(TextTemperatureId, temperature)),
new PageData(Page1Id, 0, new TextButtonData(ButtonToggleFanId, buttonText))
};
return result;
}
И это установлено для моей плитки с помощью bandClient.TileManager.SetPagesAsync. Что дало мне довольно удивительный результат: только последний элемент на каждой странице имел значение. Таким образом, это означает, что только текст даты и кнопка фактически показали текст Поскольку сэмпл в сэмплах Band SDK использует только один элемент пользовательского интерфейса, я повторил добавление элементов PageData, верно?
Неправильно!
Оказывается, вы можете добавлять значения в элемент PageData только один раз за вызов SetPagesAsync. Итак, что вам нужно сделать, это:
private List<PageData> BuildTileData(string timeText,
string dateText,
string temperature,
string buttonText)
{
var result = new List<PageData>
{
new PageData(Page2Id, 1,
new TextBlockData(TextTimeId, timeText),
new TextBlockData(TextDateId, dateText)),
new PageData(Page1Id, 0,
new IconData(IconId, 1),
new TextButtonData(ButtonToggleFanId, buttonText),
new TextBlockData(TextTemperatureId, temperature)),
};
return result;
}
Увидеть разницу? Добавьте только 2 элемента PageData , по одному на каждую страницу , а не по одному на каждый объект данных элемента страницы . Может быть, элементарно, но я это упустил. Уже довольно давно. Конструкторы PageData дают некоторую подсказку:
public PageData(Guid pageId, int pageLayoutIndex, IEnumerable<PageElementData> values);
public PageData(Guid pageId, int pageLayoutIndex, params PageElementData[] values);
третий параметр — это не объект данных элемента страницы, а его список. Дело в том, что я создал пользовательский интерфейс по требованию (когда я нажал на плитку), а затем он работал как ожидалось — но не секунды.
Мне потребовалось некоторое время, чтобы выяснить это, так что я решил, что лучше всего сразу написать об этом в блоге. Может быть, я здесь помогаю, может, я просто документирую свою глупость, но тем не менее;)
На этот раз я пропускаю демонстрационный образец — если вы столкнулись с этой проблемой, вы уже достаточно далеко знакомы с пользовательским интерфейсом Band, и демо, над которым я работаю, в любом случае содержит этот код и, надеюсь, скоро появится онлайн. Внимательные читатели поймут, что именно включает в себя эта демонстрация.
Happy Band кодирования!