2010-10-27 16 views
5

:haga clic en Deshabilitar derecho y permitir que la izquierda haga clic para contextual en WPF utilizando código de 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> 

estoy usando el patrón MVVM. En ViewModel tengo una propiedad 'IsMenuOpen' que controla el menú contextual abrir cerrar. El problema es que puedo deshabilitar el clic derecho y no puedo mostrar el menú contextual con el clic izquierdo.

+0

¿Cómo abre el menú contextual? ¿es un menú emergente o el control de menú contextual real – TerrorAustralis

+0

es un menú contextual – suman

+0

y cuando hace clic derecho, no se abre, pero el clic izquierdo tampoco lo abre? ¿ForegroundPhoneCommand hace que la propiedad IsMenuOpen se establezca en verdadero? y la propiedad IsMenuOpen implementa INotifyPropertyChange – TerrorAustralis

Respuesta

0

Si desea vincular un menú a una propiedad, considere el control emergente. Cuenta con una funcionalidad similar al menú de contexto, pero no está limitado a un determinado botón del ratón ...

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

Esto funcionó para mí usando XAML similar a la pregunta.

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

Se puede hacer así como así:

<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

Algunas cosas para no perder de vista:

  1. Asegúrese de que el DataContext de la ContextMenu es válido.
  2. Asegúrese de que IsOpen sea un enlace de TwoWay.
  3. Si va a intentar hacer clic con el botón izquierdo, recuerde que el PlacementTarget no es válido, por lo que tendrá que configurar Button.ContextMenu.PlacementTarget = this, y luego IsMenuOpen = true para que se muestre.

Mi fragmento de código de referencia:

<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> 

Y en el modelo de vista:

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

Se puede comprobar también ContextMenuService.IsEnabled propiedad adjunta en el control de los padres. Solo bloqueará el clic derecho y aún podrá mostrar el menú manualmente con el clic izquierdo, por lo tanto, según el ejemplo anterior:

<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

En serio, esto claramente no funciona en absoluto ... mi menú de contexto sigue apareciendo y desaparecen de inmediato – user1034912

Cuestiones relacionadas