private void AddItemToMenu(ToolbarItemWrapper item)
        {
            if (item.Item is ToolbarPicker)
            {
                var pickerItem = (ToolbarPicker)item.Item;
                var menuItem   = new MenuFlyoutSubItem();
                menuItem.DataContext = item;
                menuItem.Text        = item.Item.Title;

                foreach (var toolbarSubItem in ((ToolbarPicker)item.Item).Items)
                {
                    var menuSubItem = new ToggleMenuFlyoutItem();
                    menuSubItem.DataContext = toolbarSubItem;
                    menuSubItem.Text        = toolbarSubItem.Title;
                    menuSubItem.Click      += MenuSubItem_Click;
                    menuSubItem.IsChecked   = toolbarSubItem == pickerItem.SelectedItem;

                    menuItem.Items.Add(menuSubItem);
                }

                MenuFlyout.Items.Add(menuItem);
            }
            else
            {
                var menuItem = new MenuFlyoutItem();
                menuItem.DataContext = item;
                menuItem.Text        = item.Item.Title;
                menuItem.Command     = ((ToolbarButton)item.Item).Command;

                MenuFlyout.Items.Add(menuItem);
            }

            MenuButton.Opacity = 1;
        }
        private void UpdateItems()
        {
            var totalItemsWidth = ItemsPanel.Children.OfType <ContentControl>().Sum(c => c.ActualWidth);

            if (totalItemsWidth > this.ActualWidth - MenuButton.ActualWidth)
            {
                int i = ItemsPanel.Children.Count - 1;
                while (i >= 0)
                {
                    var control = (ContentControl)ItemsPanel.Children[i];

                    var position = control.TransformToVisual(ItemsPanel).TransformPoint(new Point());

                    if (position.X + control.ActualWidth < this.ActualWidth - MenuButton.ActualWidth)
                    {
                        break;
                    }
                    else
                    {
                        var item        = (ToolbarItem)control.Content;
                        var itemWrapper = new ToolbarItemWrapper()
                        {
                            ActualWidth = control.ActualWidth, Item = item
                        };
                        control.ContentTemplate = null; //doesn't remove correctly without this
                        ItemsPanel.Children.Remove(control);
                        AddItemToMenu(itemWrapper);
                    }

                    i--;
                }
            }
            else
            {
                int i = MenuFlyout.Items.Count - 1;
                while (i >= 0)
                {
                    var menuItem    = MenuFlyout.Items[i];
                    var itemWrapper = (ToolbarItemWrapper)menuItem.DataContext;

                    if (totalItemsWidth + itemWrapper.ActualWidth <= this.ActualWidth - MenuButton.ActualWidth)
                    {
                        RemoveItemFromMenu(itemWrapper);

                        AddItemToPanel(itemWrapper.Item);

                        totalItemsWidth += itemWrapper.ActualWidth;
                    }
                    else
                    {
                        break;
                    }

                    i--;
                }
            }
        }
        private void RemoveItemFromMenu(ToolbarItemWrapper item)
        {
            var menuItem = MenuFlyout.Items.FirstOrDefault(i => i.DataContext == item);

            if (menuItem is MenuFlyoutSubItem)
            {
                foreach (MenuFlyoutItem menuSubItem in ((MenuFlyoutSubItem)menuItem).Items)
                {
                    menuSubItem.Click -= MenuSubItem_Click;
                }
            }

            MenuFlyout.Items.Remove(menuItem);

            if (MenuFlyout.Items.Count > 0)
            {
                MenuButton.Opacity = 1;
            }
            else
            {
                MenuButton.Opacity = 0;
            }
        }