ContextMenu v Metru/Modern UI


Klasické ContentMenu jako takové v Metru, resp. Modern UI není, ale je možné ho snadno nasimulovat pomocí PopupMenu a UICommandů…

Kód samotný je velmi jednoduchý a demonstraci předvedu jako rozšíření předchozího tipu “Drag&Drop v Metru/Modern UI”, takže doporučuju přečíst… Jen pro připomenutí, v tomto minulém článku je definován GridView a ListView, mezi kterými funguje Drag&Drop. My si nyní přidáme na zmiňovaný GridView simulaci ContentMenu, ve kterém budou 2 položky:

  • “Přesunout” – přesune vybraný záznam do ListView stejně jako Drag&Drop akce.
  • “Smazat” – vymaže v GridView vybraný záznam.

Vše v podsadě zařídí kód v události ItemClick na GridView, na kterém je ještě nutné aktivovat tuto možnost přes nastavení property IsItemClickEnabled="True":


<GridView ...
          IsItemClickEnabled="True"
          ItemClick="AllPersonsGridViewOnItemClick" />

A samotný kód události na pozadí, kde se vytvoří a zavolá simulace ContentMenu:


private async void AllPersonsGridViewOnItemClick(object sender, ItemClickEventArgs e)
{
  PersonModel clickedPerson = e.ClickedItem as PersonModel;
  if (DataContext == null || clickedPerson == null)
    return;
  PopupMenu contextMenu = new PopupMenu();
  contextMenu.Commands.Add(new UICommand("Přesunout", command => DataContext.SelectedPersons.Add(clickedPerson)));
  contextMenu.Commands.Add(new UICommand("Smazat", command => DataContext.AllPersons.Remove(clickedPerson)));
  await contextMenu.ShowForSelectionAsync(GetElementRect(u_AllPersonsGridView));
  if (u_AllPersonsGridView.SelectedItem != null)
    u_AllPersonsGridView.SelectedItem = null;
}

private Rect GetElementRect(FrameworkElement element)
{
  if (element == null)
    return new Rect();
  GeneralTransform buttonTransform = element.TransformToVisual(null);
  Point point = buttonTransform.TransformPoint(new Point());
  return new Rect(point, new Size(element.ActualWidth, element.ActualHeight));
}

Pro vyvolání je dále vhodná i událost SelectionChanged apod., záleží na konkrétních požadavcích. Pomocná metoda GetElementRect pro získání obdélníku (podle Controlu) k umístění může být klidně veřejná a statická – i pro další použití…

, , , , , ,

Komentáře jsou uzavřeny.