Как создать Treeview с помощью контекстного меню в Silverlight 4? - PullRequest
0 голосов
/ 11 июля 2010

Silverlight 4 теперь включает возможность создания контекстного меню при щелчке правой кнопкой мыши. Может ли кто-нибудь предоставить мне пример дерева с контекстным меню правой кнопкой мыши для дерева?

В конечном счете, я хочу, чтобы в меню были показаны различные опции в зависимости от выбранной глубины узла - бонусные баллы, если пример включает это!

Ответы [ 2 ]

2 голосов
/ 05 ноября 2010

Вы можете использовать это меню с открытым исходным кодом для этого:

http://sl4popupmenu.codeplex.com

Элемент управления поддерживает щелчок правой кнопкой мыши на TreeViews из коробки.Код был адаптирован из примера кода на домашней странице для использования TreeView вместо DataGrid:

    private void GenerateMenu()
    {
        var data = new ObservableCollection<string>("Item 1,Item 2,Item 3,Item 4,Item 6,Item 7,Item 8".Split(','));
        TreeView treeView1 = new TreeView() { Margin = new Thickness(50), ItemsSource = data };
        this.LayoutRoot.Children.Add(dataGrid1);

        // Create the submenu
        var pmTimeSub = new PopupMenu();
        pmTimeSub.AddItem("Time Now", null);
        // Create the main menu
        var pm = new PopupMenu();
        pm.AddItem("Delete row", delegate { data.RemoveAt(dataGrid1.SelectedIndex); });
        pm.AddSeparator();
        pm.AddSubMenu(pmTimeSub, "Get Time ", "images/arrow.png", null, null, false, null); 
        // Attach the submenu pmTimeSub
        pm.AddSeparator();
        pm.AddItem("Demo2", delegate { this.Content = new Demo2(); });

        // Set dataGrid1 as the trigger element
        pm.AddTrigger(TriggerTypes.RightClick, treeView1);

        // Showing main menu
        pm.Showing += (sender, e) =>
        {
            pm.PopupMenuItem(0).Header = "Delete " + treeView1.SelectedItem;
            TreeViewItem tvi = pm.GetClickedElement<TreeViewItem>();

            // Add code to calculate the node depth here using the GetParentTreeViewItem method
            // Add code to modify the menu items according to the node depth value.

            pm.PopupMenuItem(0).IsVisible =
            pm.PopupMenuItem(1).IsVisible = tvi != null;
        };
        // Showing submenu
        pmTimeSub.Showing += delegate
        {
            pmTimeSub.PopupMenuItem(0).Header = DateTime.Now.ToLongTimeString();
        };
    }

Обратите внимание, что код пока не позволяет отображать различные меню на глубине узла.Для этого вы можете использовать следующий метод, чтобы получить родительский элемент TreeViewItem, по которому щелкнули:ноль.Вы должны поместить этот код в событие, в котором отображается меню, а затем добавить туда необходимый код, чтобы отобразить соответствующее меню.

Надеюсь, это поможет.

0 голосов
/ 23 октября 2011

Итак, я попробовал приведенный выше код, скачал и попытался включить в существующее приложение Silverlight.Я смог найти более простое решение.Это добавит контекстное меню, позволяющее щелкать правой кнопкой мыши на ветвях (заголовках или родительских узлах).

        private ContextMenu menu;

        foreach(var model in models)
        {

            // Populate the Tree View Control
            var cb = new CheckBox {Content = model.Value};
            cb.Click += new RoutedEventHandler(cb_Click);

            var header = new TreeViewItem {Header = cb};

            // Menu for Header
            menu = new ContextMenu();
            MenuItem setAsRows = new MenuItem();
            setAsRows.Header = "Set as Rows";
            setAsRows.Click += new RoutedEventHandler(setAsRows_Click);
            menu.Items.Add(setAsRows);
            MenuItem addToRows = new MenuItem();
            addToRows.Header = "Add to Rows";
            addToRows.Click += new RoutedEventHandler(addToRows_Click);
            menu.Items.Add(addToRows);
            MenuItem setAsCols = new MenuItem();
            setAsCols.Header = "Set as Columns";
            menu.Items.Add(setAsCols);
            MenuItem addToCols = new MenuItem();
            addToCols.Header = "Add to Columns";
            menu.Items.Add(addToCols);
            header.ContextMenu = menu;
            treeView1.Items.Add(header);

            var thisItem = treeView1.Items;

            // Model Contexts
            var contexts = myFramework.GetConceptsOfModel(model.Key);
            // Add Leafs To Branch
            foreach(var context in contexts)
            {
                cb = new CheckBox {Content = context.Value.ToString()};
                header.Items.Add(cb);
            }
        }
...