2012-05-17 13 views
5

que tienen un control de usuario como esto:Cómo usar un ContextMenu UserControl en WPF?

<UserControl x:Class="MyApp.UserControls.MyContextMenu" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      ContextMenuOpening="OnContextMenuOpening" 
      d:DesignHeight="300" d:DesignWidth="300"> 

    <UserControl.ContextMenu> 
     <ContextMenu> 
     ... 
     </ContextMenu> 
    </UserControl.ContextMenu> 
</UserControl> 

Mi pregunta es: ¿cómo se utiliza ese menú contextual para algo así como una cuadrícula de datos:

<DataGrid ContextMenu="{usercontrols:MyContextMenu}" 

Desafortunadamente eso no funciona debido a que el especificado el valor es incorrecto y esperaba un ContextMenu.

Nota: Necesito reutilizar mi menú contextual en varios lugares, así que lo he puesto en su propio archivo. Además, tengo que ser capaz de escuchar a OnContextMenuOpening eventos, porque el menú después de la apertura tiene que hacer un trabajo sobre el menú y el evento no es despedido por el menú contextual tristemente: http://connect.microsoft.com/VisualStudio/feedback/details/353112/contextmenu-opening-event-doesnt-fire-properly

"sí ContextMenu es una Clase derivada de FrameworkElement, pero este evento no se generará desde el menú contextual que se abre como fuente . El evento se genera desde el elemento que "posee" el menú de contexto como una propiedad y solo se genera cuando un usuario intenta abra un menú contextual en la interfaz de usuario. "

Este problema de evento es la razón por la que he puesto el menú para un control de usuario, para que el control de usuario pueda obtener el evento y hacer el trabajo.

Actualización: traté de tener como un elemento raíz y ampliar el menú contextual:

enter image description here

Y de código subyacente:

enter image description here

Pero estoy obteniendo: ContextMenu cannot have a logical or visual parent.

Respuesta

7

Independientemente de cómo llame a su UserControl, no es un ContextMenu. Usted tendría que derivar de ContextMenu en lugar de control de usuario:

<ContextMenu x:Class="MyApp.MyContextMenu" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <MenuItem Header="Item 1"/> 
    <MenuItem Header="Item 2"/> 
    ... 
</ContextMenu> 

y

public partial class MyContextMenu : ContextMenu 
{ 
    public MyContextMenu() 
    { 
     InitializeComponent(); 
    } 
} 

Pero ¿por qué haces eso en absoluto?

+0

Estoy abierto a sugerencias. Sin embargo, el suyo no funcionará, porque "ContextMenu no puede tener un elemento primario lógico o visual". No puede definir 'ContextMenu' como el elemento raíz. – Tower

+0

¿Como qué elemento raíz? Me acabo de derivar de eso y funciona. – Clemens

+0

No funciona para mí. Se queja de que 'ContextMenu' no puede tener un elemento primario lógico o visual. Es decir., significa que los menús contextuales solo se pueden usar para los valores de propiedad ContextMenu del elemento UI, no como elementos. Esto también tiene otro problema: no puedo escuchar los eventos 'OnContextMenuOpening'. – Tower

3

Tratar de defineit como:

<DataGrid.Resources> 
    <ContextMenu x:Key="DgContextMenu"> 
     ... 
    </ContextMenu> 
</DataGrid.Resources> 

y después de usarlo como

<DataGrid ContextMenu="{StaticResource DgContextMenu} 

En caso de trabajo.

+0

¿Qué quiere decir con que no puedo definir una clave porque es un control de usuario y no un recurso o puedo? – Tower

+0

@rFactor: si desea utilizar ** exactamente ** ese de control del usuario, si es así, puede definir el menú como un recurso estático y usarlo en controles boh. – Tigran

Cuestiones relacionadas