我正在使用C#和WPF,但我不知道如何完成以下任务:

我有一个TreeView,其中包含TreeViewItems。在每个TreeViewItem.Header中,都有一个堆栈面板,其中包含一个图标,一个文本和一个ContextMenu(cotext菜单在TreeView.Resources中定义。当用户在堆栈面板上单击鼠标右键时,将显示上下文菜单,其中包含一个MenuItem。在该MenuItem的Click事件上,将创建一个自定义对话框,并且该对话框需要对打开该上下文菜单的TreeViewItem的引用。

这是定义树视图的XAML代码:

<TreeView Grid.Row="1" Margin="5, 3, 5, 3">
    <TreeView.Resources>
        <ContextMenu x:Key="RoomsContextMenu">
            <MenuItem Header="Add Rooms" VerticalAlignment="Bottom" Click="addRom_Click">
                <MenuItem.Icon>
                    <Image Width="20" Height="20" Source="/GroupAddressCreatorWPF;component/Images/add.png" />
                </MenuItem.Icon>
            </MenuItem>
        </ContextMenu>
    </TreeView.Resources>

    <TreeViewItem>
        <TreeViewItem.Header>
            <StackPanel Orientation="Horizontal" ContextMenu="{StaticResource RoomsContextMenu}">
                <Image Width="5" Height="5" Margin="3,0"
                       Source="/GroupAddressCreatorWPF;component/Images/red.png" />
                <TextBlock Text="Main area 1" />
            </StackPanel>
        </TreeViewItem.Header>
    </TreeViewItem>
</TreeView>


这是创建自定义对话框的菜单项中的click事件实现,在这里我需要访问TreeViewItem:

private void addRom_Click(object sender, RoutedEventArgs e)
{
    AddRoomsDialog roomsDialog = new AddRoomsDialog(???);
    roomsDialog.Show();
}

最佳答案

谢谢伦坎。
我必须修改XAML文件,以便用户能够在树状视图中删除子级。现在,我的XAML文件如下所示:
                

               <TreeView.Resources>
                    <ContextMenu x:Key="RoomsContextMenu">
                        <MenuItem Header="Add Rooms" VerticalAlignment="Bottom" Click="addRom_Click">
                            <MenuItem.Icon>
                                <Image Width="20" Height="20" Source="/GroupAddressCreatorWPF;component/Images/add.png" />
                            </MenuItem.Icon>
                        </MenuItem>
                    </ContextMenu>
                    <HierarchicalDataTemplate DataType="{x:Type local:MainArea}" ItemsSource="{Binding Path=RoomCollection}">
                        <Border Width="150" BorderBrush="RoyalBlue" BorderThickness="1" CornerRadius="2" Margin="2" Padding="2" >
                            <StackPanel Orientation="Horizontal" ContextMenu="{StaticResource RoomsContextMenu}">
                                <Image Width="10" Height="10" Margin="3,0"
                                   Source="/GroupAddressCreatorWPF;component/Images/blue.png" />
                                <TextBlock Text="{Binding MainAreaName}" />
                            </StackPanel>
                        </Border>
                    </HierarchicalDataTemplate>

                    <HierarchicalDataTemplate DataType="{x:Type local:Room}">
                        <Border Width="132" BorderBrush="Green" BorderThickness="1" CornerRadius="2" Margin="1" >
                            <StackPanel Orientation="Horizontal">
                                <Image Width="10" Height="10" Margin="3,0"
                                   Source="/GroupAddressCreatorWPF;component/Images/green.png" />
                                <TextBlock Text="{Binding RoomName}" />
                            </StackPanel>
                        </Border>
                    </HierarchicalDataTemplate>
                </TreeView.Resources>
            </TreeView>


现在问题出在这段代码中:

roomsTreeView.ContextMenuOpening += (senderContextMenu, eContextMenu) =>
{
    mMainAreaItem = ((TreeView)senderContextMenu).Items.OfType<TreeViewItem>().FirstOrDefault(item => item.IsMouseOver);
};


由于树视图中的项目不是TreeViewItem(它们是MainArea),因此上面代码中的mMainAreaItem始终为-1。我还尝试执行以下操作:

roomsTreeView.ContextMenuOpening += (senderContextMenu, eContextMenu) =>
{
    mMainAreaItem = ((TreeView)senderContextMenu).Items.OfType<MainArea>().FirstOrDefault(item => item.IsMouseOver);
};


但是,由于MainArea不包含IsMouseOver属性,因此无法编译。这是解决此问题的简便方法吗? (对不起,但是我对C#和WPF还是很陌生)。

关于c# - 从上下文菜单发送对父对象的引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36210487/

10-17 00:57
查看更多