2013-08-06 3 views
1

Во время выполнения ответа от this question я наткнулся на ошибку времени выполнения XamlParseException.XamlParseException был необработанным при добавлении MenuItems

Я объясню, когда произошла ошибка, потому что для меня это не имеет никакого смысла. Прежде всего, я использую решение из предыдущего вопроса для создания двух Context Menus, которые спускаются, когда пользователь щелкает правой кнопкой мыши по TreeViewitems.

EDIT: Для лучшего понимания, я собираюсь опубликовать код именно так, как он есть. Я все еще получаю ошибку после переключения моего кода на это.

public static TreeViewItem item1 = new TreeViewItem(); 
public static TreeViewItem item2 = new TreeViewItem(); 

ContextMenu item1_CM = new ContextMenu() { Background = Brushes.White, BorderBrush = Brushes.Black, BorderThickness = new Thickness(1) }; 
     MenuItem add1 = new MenuItem() { Header = "Add..." }; //Add & Delete MenuItems 
     MenuItem delete1 = new MenuItem() { Header = "Delete..." }; 

ContextMenu item2_CM = new ContextMenu() { Background = Brushes.White, BorderBrush = Brushes.Black, BorderThickness = new Thickness(1) }; 
     MenuItem add2 = new MenuItem() { Header = "Add..." }; //Add & Delete MenuItems 
     MenuItem delete2 = new MenuItem() { Header = "Delete..." }; 

public constructor() 
{ 
    Tree = new ObservableCollection<TreeViewItem>(); 
    Tree.Add(item1); 
    Tree.Add(item2); 

    //Add MenuItems to TreeView ContextMenus 
    item1_CM.Items.Add(add1); 
    item1_CM.Items.Add(delete1); 
    item1.Items.Add(item1_CM); 

    item2_CM.Items.Add(add2); 
    item2_CM.Items.Add(delete2); 
    item2.Items.Add(item2_CM); 
} 

добавить два MenuItems ТОЧНО, как это для двух TreeViewItems. Если я скомпилирую и запускаю первый реализованный набор, программа работает нормально, но после добавления нового MenuItems к другому TreeViewItem, я получаю ошибку XamlParseException was unhandled. Что может быть причиной этого?

Благодарим за помощь.

XAML По просьбе

<Window x:Class="CircularButtonPrototype.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    xmlns:cmp="clr-namespace:System.ComponentModel;assembly=WindowsBase" 
    Title="Window1" MinHeight="685" MaxHeight="685" Height="685" MinWidth="1044" MaxWidth="1044" Width="1044" AllowsTransparency="False" WindowStartupLocation="CenterScreen" WindowStyle="None" Visibility="Visible"> 
</Window> 

Мои TreeView в XAML:

<TreeView Name="Tree_One" ItemsSource="{Binding Tree}" HorizontalAlignment="Left" Background="White" SelectedItemChanged="Tree_One_SelectedItemChanged" /> 
+1

Можете ли вы опубликовать свой код XAML? Похоже, если у вас там что-то нерегулярное. – Sonhja

+0

Несомненно, только верхняя часть, вплоть до 'Название'? Кроме того, просто примечание, я не коснулся моего XAML со времени последнего вопроса. –

+0

Но я вижу только код позади. Где вы разместили свой XAML? – Sonhja

ответ

0

Ваша проблема в этой строке:

item1.Items.Add(item1_CM); 
... 
item2.Items.Add(item2_CM); 

изменить его так:

item1.ContextMenu = item1_CM; 
... 
item2.ContextMenu = item2_CM; 

Возможно ли повторное использование кода?

public ObservableCollection<TreeViewItem> Tree { get; set; } 

    public static TreeViewItem Item = new TreeViewItem {Header = "MainTreeViewItem"}; 
    public static TreeViewItem Item2 = new TreeViewItem {Header = "MainTreeViewItem"}; 

    ContextMenu contextMenu = new ContextMenu { Background = Brushes.White, BorderBrush = Brushes.Black, BorderThickness = new Thickness(1) }; 
    MenuItem addItem = new MenuItem() { Header = "Add..." }; //Add & Delete MenuItems 
    MenuItem deleteItem = new MenuItem() { Header = "Delete..." }; 

    public MainWindow() 
    { 
     Tree = new ObservableCollection<TreeViewItem>(); 
     //Add MenuItems to TreeView ContextMenus 
     contextMenu.Items.Add(addItem); 
     contextMenu.Items.Add(deleteItem); 

     Item.ContextMenu = contextMenu; 
     Item2.ContextMenu = contextMenu; 

     Tree.Add(Item); 
     Tree.Add(Item2); 
    } 

ПРИМЕЧАНИЕ: вы будете использовать тот же ContextMenu для обоих. Используйте его и попробуйте проверить, какой элемент отправляет событие, чтобы удалить соответствующий адрес;)

+0

Ничего, это работает! =) Большое вам спасибо! –

+0

Возможно, я должен задать новый вопрос об этом, но как бы реализовать добавление событий click для этих «MenuItems», если оба дерева TreeViewItems имеют один и тот же «ContextMenu»? –

+0

Я не пробовал это явно, но я думаю, вы могли бы проверить, какой элемент является отправителем, а затем действовать по существу. Но я думаю, что было бы проще создать другой ContextMenu для каждого из них. – Sonhja