protected override void Attach()
        {
            _control = ControlObject as Menu;
            List <MenuItem> items = new List <MenuItem>();

            HeaderedItemsControlUtility.GetChildren(_control, items);
            foreach (var element in items)
            {
                var    item = element;
                string text = HeaderedItemsControlUtility.GetItemText(item);
                if (string.IsNullOrEmpty(text))
                {
                    continue;
                }

                RoutedEventHandler opened = (s, e) =>
                {
                    SubmenuOpened(item, new string[] { text });
                };
                item.SubmenuOpened += opened;

                RoutedEventHandler click = (s, e) =>
                {
                    Click(item, new string[] { text });
                };
                item.Click += click;
                _detach.Add(() =>
                {
                    item.SubmenuOpened -= opened;
                    item.Click         -= click;
                });
            }
        }
        void Expanded(TreeViewItem parentItem, string[] texts)
        {
            AddSentence(new TokenName(), ".GetItem(" + MakeGetArgs(texts) + ").EmulateChangeExpanded(true",
                        new TokenAsync(CommaType.Non), ");");

            RoutedEventHandler closedForGenerate = null;

            closedForGenerate = (s, ee) =>
            {
                Collapsed(parentItem, texts);
                parentItem.Collapsed -= closedForGenerate;
            };
            parentItem.Collapsed += closedForGenerate;

            parentItem.Dispatcher.BeginInvoke((MyAction) delegate
            {
                List <TreeViewItem> items = new List <TreeViewItem>();
                HeaderedItemsControlUtility.GetChildren(parentItem, items);
                foreach (var element in items)
                {
                    var item    = element;
                    string text = HeaderedItemsControlUtility.GetItemText(item);
                    if (string.IsNullOrEmpty(text))
                    {
                        continue;
                    }

                    List <string> nextTexts = new List <string>(texts);
                    nextTexts.Add(text);

                    RoutedEventHandler opened = (s, e) =>
                    {
                        Expanded(item, nextTexts.ToArray());
                    };
                    item.Expanded += opened;

                    RoutedEventHandler click = (s, e) =>
                    {
                        SelectedChanged(item, nextTexts.ToArray());
                    };
                    item.Selected   += click;
                    item.Unselected += click;


                    RoutedEventHandler closed = null;
                    closed = (s, ee) =>
                    {
                        item.Expanded        -= opened;
                        item.Selected        -= click;
                        item.Unselected      -= click;
                        parentItem.Collapsed -= closed;
                    };
                    parentItem.Collapsed += closed;
                }
            });
        }
        void SubmenuOpened(MenuItem parentItem, string[] texts)
        {
            parentItem.Dispatcher.BeginInvoke((MyAction) delegate
            {
                List <MenuItem> items = new List <MenuItem>();
                HeaderedItemsControlUtility.GetChildren(parentItem, items);
                foreach (var element in items)
                {
                    var item    = element;
                    string text = HeaderedItemsControlUtility.GetItemText(item);
                    if (string.IsNullOrEmpty(text))
                    {
                        continue;
                    }

                    List <string> nextTexts = new List <string>(texts);
                    nextTexts.Add(text);
                    RoutedEventHandler opened = (s, e) =>
                    {
                        SubmenuOpened(item, nextTexts.ToArray());
                    };
                    item.SubmenuOpened += opened;

                    RoutedEventHandler click = (s, e) =>
                    {
                        Click(item, nextTexts.ToArray());
                    };
                    item.Click += click;
                    RoutedEventHandler closed = null;
                    closed = (s, ee) =>
                    {
                        item.SubmenuOpened       -= opened;
                        item.Click               -= click;
                        parentItem.SubmenuClosed -= closed;
                    };
                    parentItem.SubmenuClosed += closed;
                }
            });
        }
Esempio n. 4
0
        void AttachChildren(Visual parent, List <MenuItem> attachedChildren, string[] texts)
        {
            List <MenuItem> items = new List <MenuItem>();

            HeaderedItemsControlUtility.GetChildren(parent, items);
            foreach (var element in items)
            {
                var    item = element;
                string text = HeaderedItemsControlUtility.GetItemText(item);
                if (string.IsNullOrEmpty(text))
                {
                    continue;
                }

                List <string> nextTexts = new List <string>(texts);
                nextTexts.Add(text);

                //まだイベントにアタッチしてない場合
                if (!attachedChildren.Contains(item))
                {
                    attachedChildren.Add(item);

                    RoutedEventHandler click = (s, e) =>
                    {
                        Click(item, nextTexts.ToArray());
                    };
                    item.Click += click;

                    _detach.Add(() =>
                    {
                        item.Click -= click;
                    });
                }

                //子アイテムにアタッチ
                AttachChildren(item, attachedChildren, nextTexts.ToArray());
            }
        }