Статьи

Получил: пользовательская страница группы Microsoft показывает только данные в последнем добавленном элементе пользовательского интерфейса

Сегодня я наконец-то прибил очень странную проблему в  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 кодирования!