2010-10-27 99 views
5

代码启用WPF为文本菜单左键:禁用右键单击使用MVVM

<Button Style="{StaticResource HPForegroundStyle}" IsTabStop="False"     
     Command="{Binding ForegroundPhoneCommand}" Click="Button_Click"> 
        <Button.ContextMenu>     
         <ContextMenu ItemsSource="{Binding OptionsMenuItemList}"       ItemContainerStyle="{StaticResource ContextMenuItemStyle}" 
            IsOpen="{Binding IsMenuOpen}"           
            PlacementTarget="{Binding RelativeSourc={RelativeSource AncestorType={x:Type Button}}}"> 
         </ContextMenu> 
        </Button.ContextMenu> 
    </Button> 

我使用MVVM模式。在ViewModel我有一个属性'IsMenuOpen',它控制上下文菜单打开关闭。问题是,我可以禁用右键点击,并不能左键单击显示上下文菜单。

+0

如何打开上下文菜单?它是一个弹出式菜单或实际的上下文菜单控制 – TerrorAustralis 2010-10-27 05:53:34

+0

其上下文菜单 – suman 2010-10-27 06:13:04

+0

当你右键点击,它不会打开,但左键点击并不打开它吗? ForegroundPhoneCommand是否会将IsMenuOpen属性设置为true?并且IsMenuOpen属性是否实现INotifyPropertyChange – TerrorAustralis 2010-10-27 06:17:37

回答

0

如果要将菜单绑定到属性,请考虑Popup控件。它具有与上下文菜单类似的功能,但不绑定到特定的鼠标按钮...

<Popup IsVisible = {Binding IsMenuOpen} > 
    <!-- Fill in what you need here --> 
</Popup> 
2

这对我使用类似于问题的XAML。

private bool _isMenuOpen = false; 
public bool IsMenuOpen 
{ 
    get { return _isMenuOpen; } 
    set 
    { 
     // Don't allow the UI (right-click) to set this property to true 
     if (!value) 
      _isMenuOpen = value; 
    } 
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    Button btn = sender as Button; 
    _isMenuOpen = true; 
    btn.ContextMenu.IsOpen = true; 
} 
0

你可以做到这一点就像这样:

<Button x:Name="btn" Click="btn_Click" MouseRightButtonDown="btn_MouseRightButtonDown"> 
    <Button.ContextMenu> 
     <ContextMenu x:Name="popup" Visibility="Collapsed"> 
      <MenuItem Header="aaa"></MenuItem> 
      <MenuItem Header="bbb"></MenuItem> 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 

private void btn_Click(object sender, RoutedEventArgs e) 
{ 
    popup.Visibility = Visibility.Visible; 
    popup.IsOpen = true; 
} 

private void btn_MouseRightButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    popup.Visibility = Visibility.Collapsed; 
} 
2

有几件事情,以保持跟踪:

  1. 确保文本菜单的DataContext的是有效的。
  2. 确保IsOpen是双向绑定。
  3. 如果您要尝试左键单击打开,请记住PlacementTarget无效,因此您必须设置Button.ContextMenu.PlacementTarget = this,然后IsMenuOpen = true以显示它。

我的参考代码片段:

<Style x:Key="SubjectButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource CommandButtonStyle}"> 
<Setter Property="Foreground" Value="Green" /> 
<Setter Property="ContextMenu"> 
    <Setter.Value> 
     <ContextMenu DataContext="{Binding PlacementTarget.DataContext.Manager, RelativeSource={RelativeSource Self}}" 
        ItemsSource="{Binding SubjectManager.ContextMenuItems}" 
        IsOpen="{Binding SubjectManager.ContextMenuIsOpen, Mode=TwoWay}"> 
      <ContextMenu.ItemContainerStyle> 
       <Style TargetType="MenuItem"> 
        <Setter Property="Command" Value="{Binding OnClick}" /> 
       </Style> 
      </ContextMenu.ItemContainerStyle> 
     </ContextMenu> 
    </Setter.Value> 
</Setter> 
<Style.Triggers> 
    <Trigger Property="IsMouseOver" Value="True"> 
     <Setter Property="Foreground" Value="DarkGreen" /> 
    </Trigger> 
</Style.Triggers> 
</Style> 

并在视图模式:

public void ShowContextMenu(SearchCondition searchCondition, Button button) 
{ 
    button.ContextMenu.DataContext = this; 
    SubjectManager.OpenContextMenu(); 
} 
18

您还可以检查父控件ContextMenuService.IsEnabled附加属性。它会阻止只有右键单击,你仍然可以在左键单击手动显示菜单,所以基于前面的示例:

<Button x:Name="btn" Click="btn_Click" ContextMenuService.IsEnabled="false"> 
    <Button.ContextMenu> 
     <ContextMenu x:Name="popup"> 
     ... 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 

private void btn_Click(object sender, RoutedEventArgs e) 
{ 
    popup.Visibility = Visibility.Visible; 
    popup.IsOpen = true; 
} 
+1

严重显然这根本不起作用..我的上下文菜单仍然出现,并立即消失 – user1034912 2017-02-25 04:28:25