2009-08-13 10 views
13
<Button Name="btnFoo" Content="Foo" > 
    <Button.ContextMenu Placement="Bottom" PlacementTarget="btnFoo"> 
     <MenuItem Header="Bar" /> 
    </Button.ContextMenu> 
</Button> 

me da un error de ejecución de tipo 'UIElement' no tiene una clase TypeConverter públicaEstablecer una propiedad PlacementTarget de WPF ContextMenu en XAML?

También probé

<Button Name="btnFoo" Content="Foo" > 
    <Button.ContextMenu Placement="Bottom" PlacementTarget="{Binding ElementName=btnFoo}"> 
     <MenuItem Header="Bar" /> 
    </Button.ContextMenu> 
</Button> 

y que ponen el ContextMenu en la esquina superior izquierda de la pantalla, en lugar que en el botón

Respuesta

23

Debe establecer la propiedad adjunta ContextMenuService.Placement en el botón, como se indica en los comentarios en la documentación para ContextMenu.Placement.

<Button Name="btnFoo" Content="Foo" ContextMenuService.Placement="Bottom"> 
    <Button.ContextMenu> 
     <ContextMenu> 
      <MenuItem Header="Bar" /> 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 
+0

perfecto, gracias! – kenwarner

+0

Estoy confundido. ¿Por qué no funcionaba el enlace de PlacementElement? – VitalyB

+1

@VitalyB: como dice MSDN Docs, la propiedad PlacementTarget se cambia cuando se abre el menú contextual (ya sea MousePoint o Center, dependiendo de cómo el usuario abre el menú). Debido a esto, establecer un enlace en la propiedad no funcionará; se cambiará. – Tarsier

3

¿Has probado esto:

<Button Name="btnFoo" Content="Foo"> 
    <Button.ContextMenu> 
     <ContextMenu> 
      <MenuItem Header="Bar" /> 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 

Esto hará que ContextMenu se abra al hacer clic con el botón derecho del mouse (en el botón). ¿Cuál creo que sea su ubicación deseada, verdad?

--- --- EDITAR En ese caso, utilice la siguiente:

<Button Name="btnFoo" Content="Foo" ContextMenuOpening="ContextMenu_ContextMenuOpening"> 
    <Button.ContextMenu> 
     <ContextMenu Placement="Bottom"> 
      <MenuItem Header="Bar" /> 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 

Y en código detrás:

private void ContextMenu_ContextMenuOpening(object sender, ContextMenuEventArgs e) 
{ 
    // Get the button and check for nulls 
    Button button = sender as Button; 
    if (button == null || button.ContextMenu == null) 
     return; 
    // Set the placement target of the ContextMenu to the button 
    button.ContextMenu.PlacementTarget = button; 
    // Open the ContextMenu 
    button.ContextMenu.IsOpen = true; 
    e.Handled = true; 
} 

puede volver a utilizar el método de varios botones y ContextMenu de

..
+1

el proyecto en el que trabajo hace mucho tiempo comenzó a usar botones y ContextMenus para crear un efecto ComboBox. aunque esto es probablemente un poco tonto, es demasiado tarde para cambiarlo ahora. Por lo tanto, quiero que ContextMenu se abra debajo del botón, no donde sea que realmente haya ocurrido el clic. – kenwarner

+0

La edición debería ser el truco ... – Zenuka

+0

Cuando se implementa esto, el menú contextual se hace con el botón derecho del mouse. ¿Es posible lograr la misma funcionalidad con el clic izquierdo del mouse? Gracias por adelantado. – samar

0

Se puede usar un <Menu />, diseñado como un Button y evitar la molestia con el ContextMenuService.

Cuestiones relacionadas