我根据" BODPresentationRule"的列表动态创建菜单。对象。虽然我可以将它们添加到列表中,但我无法找到如何使用datatemplate将click事件添加到(子)MenuItems。
当我使用First MenuItem中的PolygonShapesMenu_OnClick Click事件时,我可以看到有一个点击,但没有它是哪个subMenuItem。
XAML:
<Menu VerticalAlignment="Center" >
<MenuItem Name="PolygonShapesMenu" Click="PolygonShapesMenu_OnClick">
<MenuItem.Header>
<StackPanel Orientation="Horizontal">
<Image Source="/Assets/Images/polygon.png" Height="24" Width="24"></Image>
<Label>Polygoon</Label>
</StackPanel>
</MenuItem.Header>
</MenuItem>
</Menu>
背后的代码(创建菜单) [注意,由于应用程序的性质,我没有使用MVVM(大量绘图等......):
// create and set the datatemplate
DataTemplate polyDataTemplate = new DataTemplate(typeof (BODPresentationRule));
PolygonShapesMenu.ItemTemplate = polyDataTemplate;
// create and add the text box to the data template
var txtElement = new FrameworkElementFactory(typeof(TextBlock));
polyDataTemplate.VisualTree = txtElement;
// set the binding in the text box bound to the name of the BodPresentationRule
txtElement.SetBinding(TextBlock.TextProperty, new Binding("Name"));
// TODO: how to intercept click event to the current selected item?
// add items to menu
foreach (BODPresentationRule rule in _presentationRules.OrderBy(r=>r.Name))
{
PolygonShapesMenu.Items.Add(rule);
}
仅供参考,结果如下:
我正在考虑使用触发器拦截将添加到数据模板的点击事件,但我甚至不确定这是否是正确的方法。
总结:我需要知道BODPresentationRule(MenuItem)被点击了什么;如何拦截指向该规则的正确点击事件。
答案 0 :(得分:3)
您只需处理&#34;标题&#34; MenuItem在这里。将Click处理程序放入MenuItem的ItemContainerStyle内的Style中。
<MenuItem>
<MenuItem.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<EventSetter Event="Click" Handler="PolygonShapesMenu_OnClick"/>
</Style>
</MenuItem.Resources>
</MenuItem>
点击的子MenuItem将成为发件人。