WPF获取menuItem的父级

我不知道如何获取menuItem的父级? 我搜索了所有的周围,但无法得到一个好的答案……

我的XAML是:

          private void MenuItemWithRadioButtons_Click(object sender, System.Windows.RoutedEventArgs e) { MenuItem mi = sender as MenuItem; if (mi != null) { RadioButton rb = mi.Icon as RadioButton; if (rb != null) { rb.IsChecked = true; } //Here I want to get the parent menuItem } } 

在代码中,当我单击像“MenuItemVideoDevices”这样的子菜单时,会触发一个事件处理函数,但我不知道如何在此函数中获取menuItem“Video”。

有谁知道?

如果您发现MenuItem.Parent属性为null ,那么您的代码并不像您发布的那样简单。 我把以下简单的XAML窗口放在一起,它工作正常:

           

也就是说, Click事件处理程序可以使用Parent属性成功检索正确的,预期的MenuItem父级:

 public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void MenuItemVideoAudioDevices_Click(object sender, RoutedEventArgs e) { MenuItem menuItem = (MenuItem)sender; MessageBox.Show("Parent's header text: " + ((MenuItem)menuItem.Parent).Header.ToString()); } } 

由于您没有提供可靠地重现问题的良好, 最小 ,完整的代码示例 ,因此我无法确定为什么在您的测试中Parent属性为null 。 但是,我可以说在我自己的场景中(导致我这个问题的那个),问题是我的子MenuItem是模板,所以不要在Parent属性中使用非null值。 请注意FrameworkElement.Parent属性的文档中的此注释:

对于模板,模板的Parent最终将为null。 要超越此点并扩展到实际应用模板的逻辑树,请使用TemplatedParent。

我发现遵循这个建议并不简单。 我的Parent属性从一开始就是null 。 但是MenuItem对象的TemplatedParent属性逻辑父级(由LogicalTreeHelper.GetParent()检索)也是如此。

我最后要做的是按照可视化树来查找具有逻辑父节点的第一个父节点。 那时,我能够使用该节点的TemplatedParent属性来检索实际的MenuItem父级。

我写了一个简单的帮助方法来概括它。 到目前为止,我使用它的唯一场景是这个MenuItem场景,我真的不知道这是否是其他情况下需要的。 但它对我有用,似乎是一个很好的起点,以防我遇到与其他子对象(或其他任何人)相似的问题。

写作扩展方法,它看起来像这样:

 public static T GetTemplatedParent(this FrameworkElement o) where T : DependencyObject { DependencyObject child = o, parent = null; while (child != null && (parent = LogicalTreeHelper.GetParent(child)) == null) { child = VisualTreeHelper.GetParent(child); } FrameworkElement frameworkParent = parent as FrameworkElement; return frameworkParent != null ? frameworkParent.TemplatedParent as T : null; } 

这允许我为任何模板化的MenuItem对象检索父MenuItem对象,而不必引入任何其他对象(显然我可以通过在某处初始化一些静态字段并检索其值来解决问题,但这非常hacky …我想要一些东西更通用,更可靠)。

MenuItem有一个Property Parent

 var parent = mi.Parent;