//TODO: Menu needs too long to render if there are too many items (> 20000). void contextMenu_Opened(object sender, RoutedEventArgs e) { contextMenu.Items.Clear(); contextMenu.ItemTemplate = ItemTemplate; contextMenu.ItemTemplateSelector = ItemTemplateSelector; // List<MenuItem> menuItems = new List<MenuItem>(); foreach (object item in Items) { if (!(item is MenuItem) && !(item is Separator)) { RibbonMenuItem menuItem = new RibbonMenuItem(); menuItem.DataContext = item; BreadcrumbItem bi = item as BreadcrumbItem; if (bi == null) { BreadcrumbItem parent = TemplatedParent as BreadcrumbItem; if (parent != null) { bi = parent.ContainerFromItem(item); } } if (bi != null) { menuItem.Header = bi.TraceValue; } Image image = new Image(); image.Source = bi != null ? bi.Image : null; image.SnapsToDevicePixels = true; image.Stretch = Stretch.Fill; image.VerticalAlignment = VerticalAlignment.Center; image.HorizontalAlignment = HorizontalAlignment.Center; image.Width = 16; image.Height = 16; menuItem.Icon = image; menuItem.Click += new RoutedEventHandler(item_Click); if (item != null && item.Equals(SelectedItem)) { menuItem.FontWeight = FontWeights.Bold; } menuItem.ItemTemplate = ItemTemplate; menuItem.ItemTemplateSelector = ItemTemplateSelector; contextMenu.Items.Add(menuItem); } else { contextMenu.Items.Add(item); } } contextMenu.Placement = PlacementMode.Relative; contextMenu.PlacementTarget = dropDownBtn; contextMenu.VerticalOffset = dropDownBtn.ActualHeight; }
void rItem_MouseEnter(object sender, MouseEventArgs e) { RibbonMenuItem item = sender as RibbonMenuItem; if (item.HasItems) { selectedItem = item; EnsureTimer().Start(); } }
protected override void PrepareContainerForItemOverride(DependencyObject element, object item) { base.PrepareContainerForItemOverride(element, item); RibbonMenuItem rItem = item as RibbonMenuItem; if (rItem != null) { rItem.MouseEnter += new MouseEventHandler(rItem_MouseEnter); rItem.MouseLeave += new MouseEventHandler(rItem_MouseLeave); } }
void rItem_MouseLeave(object sender, MouseEventArgs e) { if (timer != null) { timer.Stop(); } selectedItem = null; RibbonMenuItem item = sender as RibbonMenuItem; item.IsSubmenuOpen = false; }
void timer_Elapsed(object sender, ElapsedEventArgs e) { timer.Stop(); RibbonMenuItem item = selectedItem; if (item != null) { MyFunc d = delegate() { item.IsSubmenuOpen = true; }; this.Dispatcher.BeginInvoke(d); } }