Ожидание создания объекта с использованием await и Task - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь добавить элемент и список подэлементов в контекстное меню форм Windows.Объект, который я должен использовать, называется NTMenuItem.Вывод приведенного ниже кода заключается в печати строки «Основной элемент ...» два раза при первом открытии контекстного меню правой кнопки мыши.Затем во второй раз, когда открывается контекстное меню, строка «Добавление элементов подменю ...» будет печататься несколько раз с правильно увеличивающимся индексом, как требуется.

#region Context Menu Opening Event Handler
private async void ChartControl_ContextMenuOpening(object sender, ContextMenuEventArgs e) {
    NTMenuItem ztHolderitem     = null;
    await CreateZTMenuItem();

    for ( int j = 0 ;  j < 2 ; j++ ) {
        Print("Main item adding - ztHolderitem was null, building ZT Holder Menu item");
        cc.ContextMenu.Items.Insert(2, BuildZTHolderMenuItem());
    }
    if (ztHolderitem != null) {
        InsertZoneTypeSubMenuItems( ref ztHolderitem );
    }
}
#endregion

#region CreateZTMenuItem()
private async Task CreateZTMenuItem( ) {
    NTMenuItem ztHolderitem = cc.ContextMenu.Items.OfType<NTMenuItem>().FirstOrDefault((i)  => i.Header == Constants.ZTHolder_HeaderLabel);
}
#endregion

#region InsertZoneTypeSubMenuItems()
private void InsertZoneTypeSubMenuItems ( ref NTMenuItem ztHolderitem ) {

    int      types      = Enum.GetNames(typeof(ZoneType)).Length;
    int      t      = 0;

    for (int zt = 0; zt <= types - 1; zt++)
    {
        Print("             Adding submenu items  zt = " + zt );

        string  ztype = ((ZoneType)zt).ToString();

        NTMenuItem tempitem = ztHolderitem.Items.OfType<NTMenuItem>().FirstOrDefault((i) => 
        if (tempitem == null && ztHolderitem.Items.Count < types) {
            ztHolderitem.Items.Insert(t, BuildZTSubMenuItem(ztype));
            t++;
        }
    }
}

Кажется, что я просто не могуи надежно выполните:

NTMenuItem ztHolderitem = cc.ContextMenu.Items.OfType<NTMenuItem>().FirstOrDefault((i)  => i.Header == Constants.ZTHolder_HeaderLabel);

, а затем проверьте наличие ненулевого результата из-за последовательной печати строки «Основной элемент ...» дважды.(бесконечный цикл печати, если у меня нет цикла for, подсчитывающего до 2 раз).

У меня проблема с курицей / яйцом.Я не могу добавить пункты подменю в меню, если не создан главный NTMenuItem.Я попытался сделать

while ( ztHolderitem != null ) {
   Print("Main item adding - ztHolderitem was null, building ZT Holder Menu item");
   cc.ContextMenu.Items.Insert(2, BuildZTHolderMenuItem());
}

И это заходит в бесконечный цикл печати строки "Основной элемент ...".И я не могу дождаться задачи создания экземпляра NTMenuItem, поэтому я никогда не нахожусь в состоянии, когда я могу начать добавлять элементы подменю.

Как создать экземпляр NTMenuItem, проверить, что он не равен нулю,а затем начать добавление пунктов подменю без необходимости вручную открывать контекстное меню с помощью двух последовательных щелчков правой кнопкой мыши?

...