解决 如何在XAML中设置主菜单项的单击事件?

毁灭

活跃的成员
已加入
2020年3月28日
留言内容
36
编程经验
1-3
我的菜单与视图模型中的可观察集合完美地绑定在一起,并且所有子菜单项都可以使用xaml下面的值正确触发click事件,但是我无法为第一个菜单项设置相同的click事件。是否可以在所有主菜单项上设置相同的单击事件?

UserControl.xaml:
<Menu Background="Lavender" x:Name="Styled2" Margin="162,-46,146,335"  Grid.ColumnSpan="2">           
            <MenuItem ItemsSource="{Binding LaalKitabYears}" Height="21" Width="124" HorizontalContentAlignment="Center" Padding="0">
                <MenuItem.Header>
                    <Label VerticalContentAlignment="Top" Margin="0,0,-120,0" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" Padding="0" Content="{Binding LaalKitabYears[0].year}"/>
                </MenuItem.Header>
            <MenuItem.ItemContainerStyle>
                <Style TargetType="{x:Type 菜单Item}">
                    <Setter Property="Header" Value="{Binding Path=year}"/>
                    <Setter Property="ItemsSource" Value="{Binding subMenuItems}"/>
                    <EventSetter Event="Click" Handler="MenuItem_Click"/>
                    <Setter Property="Background" Value="LavenderBlush"/>
                    </Style>
            </MenuItem.ItemContainerStyle>
            </MenuItem>
        </Menu>

这是我在UserControl.xaml.cs中的menuClickEvent:

UserControl.xaml.cs:
  private void 菜单Item_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show((e.OriginalSource as 菜单Item).Header.ToString());
        }

3Ba27Bsq0l.gif
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,923
地点
英国
编程经验
10+
我不确定我是否理解这个问题。

您是否正在尝试使1995、2005、2010都可点击以生成日期?

抱歉,您需要非常具体,以便我确切地知道您要做什么。
 

毁灭

活跃的成员
已加入
2020年3月28日
留言内容
36
编程经验
1-3
我不确定我是否理解这个问题。

您是否正在尝试使1995、2005、2010都可点击以生成日期?

抱歉,您需要非常具体,以便我确切地知道您要做什么。
确实您说对了..例如2010触发click事件,因为它是子菜单,但1995、2005和其他父菜单项未显示相同的行为。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,923
地点
英国
编程经验
10+
该代码的哪一部分负责添加2005、2015年?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,499
地点
弗吉尼亚州切萨皮克
编程经验
10+
这是一个更完整的示例,您可以复制并粘贴以玩...
MainWindow.xaml.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Drawing;

namespace SimpleWpf
{
    public class YearMenu
    {
        public int Year { get; set; }
        public 清单<YearMenu> SubMenuItems { get; set; }

        public YearMenu(int year, params YearMenu [] subMenuItems)
        {
            Year = year;
            SubMenuItems = subMenuItems?.ToList();
        }
    }

    public partial class MainWindow : Window
    {
        public 清单<YearMenu> YearsMenu { get; set; }

        public MainWindow()
        {
            YearsMenu = new 清单<YearMenu>()
            {
                new YearMenu(1995,
                    new YearMenu(1996),
                    new YearMenu(1997),
                    new YearMenu(1998),
                    new YearMenu(1999),
                    new YearMenu(2000),
                    new YearMenu(2001),
                    new YearMenu(2002),
                    new YearMenu(2003),
                    new YearMenu(2004),
                    new YearMenu(2005)
                ),
                new YearMenu(2005,
                    new YearMenu(2006),
                    new YearMenu(2007),
                    new YearMenu(2008),
                    new YearMenu(2009),
                    new YearMenu(2010),
                    new YearMenu(2011),
                    new YearMenu(2012),
                    new YearMenu(2013),
                    new YearMenu(2014),
                    new YearMenu(2015)
                ),
                new YearMenu(2015,
                    new YearMenu(2016),
                    new YearMenu(2017),
                    new YearMenu(2018),
                    new YearMenu(2019),
                    new YearMenu(2020),
                    new YearMenu(2021),
                    new YearMenu(2022),
                    new YearMenu(2023),
                    new YearMenu(2024),
                    new YearMenu(2025)
                )
            };

            InitializeComponent();
            DataContext = this;
        }

        void 菜单Item_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show((e.OriginalSource as 菜单Item).Header.ToString());
        }
    }
}

MainWindow.xaml:
<Window x:Class="SimpleWpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Send Image" Height="450" Width="625">
    <Grid>
        <Menu Background="Lavender" x:Name="Styled2">
            <MenuItem ItemsSource="{Binding YearsMenu}" HorizontalContentAlignment="Center" >
                <MenuItem.Header>
                    <Label VerticalContentAlignment="Top" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" Content="{Binding YearsMenu[0].Year}"/>
                </MenuItem.Header>
                <MenuItem.ItemContainerStyle>
                    <Style TargetType="{x:Type 菜单Item}">
                        <Setter Property="Header" Value="{Binding Path=Year}"/>
                        <Setter Property="ItemsSource" Value="{Binding SubMenuItems}"/>
                        <EventSetter Event="Click" Handler="MenuItem_Click"/>
                        <Setter Property="Background" Value="LavenderBlush"/>
                    </Style>
                </MenuItem.ItemContainerStyle>
            </MenuItem>
        </Menu>
    </Grid>
</Window>
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,923
地点
英国
编程经验
10+
哈哈。谢谢跳伞者。我正在尝试操作OP的大脑,以锻炼在何处为新的click事件添加事件处理程序。 :)

另外,OP还想知道如何在Xaml中进行操作。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,923
地点
英国
编程经验
10+
@destro - @跳伞的示例也将执行相同的操作。但这不是在xaml代码中设置的,而是在文件后面的代码中设置的。这对你有关系吗?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,499
地点
弗吉尼亚州切萨皮克
编程经验
10+
是的,我上面的代码完全一样。我只是输入了一些代码,以使其他人更容易尝试通过复制和粘贴来重现问题,而不是使人们跳过圈来甚至只是达到重现问题的目的。

Any was a big hint as to why the two routed click events are showing the same text: The handler is always using OriginalSource. Since the original source of the event is clicking on the leaf menu item, that is what is always displayed.
 
最佳 底部