2014-10-30 65 views
0

我可以设置PlacementTargetContextMenu。它始终打开(通过Shift + F10)在列表框的中心。设置ContextMenu通过键盘打开的PlacementTarget WPF

我想:

private void listBox_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
{ 
    if (e.KeyboardDevice.Modifiers == ModifierKeys.Shift && 
     (e.Key == Key.F10 || e.SystemKey == Key.F10)){ 
     var listBox = sender as System.Windows.Controls.ListBox; 
     listBox.ContextMenu.PlacementTarget = listBox.ItemContainerGenerator.ContainerFromItem(listBox.SelectedItem) as ListBoxItem; 
    } 
} 

private void listBox_ContextMenuOpening(object sender, ContextMenuEventArgs e) 
{ 
    var listBox = sender as System.Windows.Controls.ListBox; 
    listBox.ContextMenu.PlacementTarget = listBox.ItemContainerGenerator.ContainerFromItem(listBox.SelectedItem) as ListBoxItem; 
} 

但它仍然不能按预期工作。 (我期望它显示在选定的itemlistbox的中心)

有什么建议吗?

+0

你能告诉更确切的是什么问题吗?有什么异常?或者只是ContextMenu仍然显示在中心? – 2014-10-30 08:10:04

+0

仍然显示在列表框的中心,但我期望在选定listboxitem的中心 – maskalek 2014-10-30 08:20:29

回答

1

我刚刚试过你的代码。问题是,一旦设置为ListBox,您就无法更改ContextMenuPlacementTarget。这意味着ListBox始终设置为ContextMenu的PlacementTarget。我明白,ContextMenu实际上用于所选项目。那么为什么不把它设置为每个项目?然后它预计工作。试试这个:

<ListBox ItemsSource="some_source_here"/> 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="ListBoxItem"> 
       <Setter Property="ContextMenu"> 
        <Setter.Value> 
         <!-- your ContextMenu here --> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </ListBox.ItemContainerStyle>    
</ListBox> 

这里没有涉及任何代码。只要像上面那样改变你的XAML。

+0

是的,谢谢。它会工作:)但我想有没有重写我的contextmenu相同的行为。所有绑定将无法正常工作,我将不得不重新编写它:(希望有其他解决方案 – maskalek 2014-10-30 09:08:36

+0

@maskalek我认为只有一点变化才能使绑定工作,您可以举一些你在ContextMenu上设置绑定的例子吗? – 2014-10-30 10:21:01