2012-09-28 30 views
5

Lo que quiero hacer es un UserControl que contenga una sección con una grilla, donde algo sucede al hacer clic en la grilla. Necesito la posición del píxel donde ocurrió el clic y estoy haciendo todo este estilo de MVVM. sé cómo me pueden solicitar acciones en mi modelo de vista:Obtener la posición del clic sobre el enlace del comando

<Grid> 
<Grid.InputBindings> 
    <MouseBinding Gesture="LeftClick" Command="{Binding MinimapClick}"/> 
</Grid.InputBindings> 
</Grid> 

Mi problema ahora es que no sé cómo recuperar las coordenadas ... alguna idea? ¡Agradezco tu ayuda!

+0

En caso de que no sabe cómo aceptar respuestas me gustaría dirigir hacia [este mensaje] (http://meta.stackexchange.com/questions/5234 /). –

Respuesta

5

¿Qué tal esto?

private void MinimapClick(object parameter) 
{ 
    Point mousePos = Mouse.GetPosition(myWindow); 
} 

Si usted no tiene una referencia a la ventana se podía enviarlo como un parámetro (o utilizar cualquier punto de referencia que desee).

+0

¡Buena idea! Eso me puso en el camino correcto ... Desarrollaré mi solución en mi respuesta un poco más. ¡Gracias por la ayuda! –

12

KDiTraglia tenía el puntero correcto para mí ... En cualquier caso, tuve algunos problemas para definir las acciones y el enlace a mi ViewModel. Publicaré mi solución en caso de que alguien más tenga algunos problemas. Esto es lo que he hecho en el XAML:

<Grid Width="100" Height="100" Grid.Column="2" Grid.Row="2" x:Name="TargetGrid"> 
    <Grid> 
     <Grid.InputBindings> 
      <MouseBinding Gesture="LeftClick" Command="{Binding Path=TargetClick}" CommandParameter="{Binding ElementName=TargetGrid}" /> 
     </Grid.InputBindings> 
    </Grid> 
</Grid> 

Crío control de usuario y enlazarlo a la ViewModel. En el modelo de vista implemento y crear el siguiente comando:

public class PositioningCommand : ICommand 
{ 
    public PositioningCommand() 
    { 
    } 

    public void Execute(object parameter) 
    { 
     Point mousePos = Mouse.GetPosition((IInputElement)parameter); 
     Console.WriteLine("Position: " + mousePos.ToString()); 
    } 

    public bool CanExecute(object parameter) { return true; } 

    public event EventHandler CanExecuteChanged; 
} 

public PositioningCommand TargetClick 
{ 
    get; 
    internal set; 
} 
+0

¡muchas gracias por este beta vulgaris! – Aralox

+0

Gracias hombre. U ahorró mi tiempo! – shanmugharaj

+0

Gracias señor. Esta fue una respuesta excelente. – sagneta

0

tuve un problema relacionado - Quería capturar la posición del ratón para eventos de clic para mi ContextMenu. Problema: el CommandParameter ElementName no reconoció parent (un control de imagen).

Como referencia, el error de unión que he recibido, antes a la adición de mi menú para el espacio de nombres, fue:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=imgArena'. BindingExpression:(no path); DataItem=null; target element is 'MenuItem' (Name='mnuAddItem'); target property is 'CommandParameter' (type 'Object') 

Al parecer WPF menús de contexto pertenecen a un árbol visual diferente a la de su control, por lo que la unión bastante frustrante.

Después de algunas investigaciones, he encontrado esta solución simple, que coloqué en el constructor para mi código detrás:

NameScope.SetNameScope(mnuGrid, NameScope.GetNameScope(this)); 

Donde "mnuGrid" es el nombre de mi menú de contexto.

Después de hacer esto, pude pasar mi control como parámetro a mi comando exactamente como lo hizo Beta Vulgaris anteriormente.

Como referencia, mi XAML se parece a esto:

<Image Name="imgArena" > 
     <Image.ContextMenu> 
      <ContextMenu Name="mnuGrid"> 
       <MenuItem Header="Place _Entry" Name="mnuAddItem" 
        Command="{Binding AddEntryCmd}" 
        CommandParameter="{Binding ElementName=imgArena}" /> 
      </ContextMenu> 
     <Image.ContextMenu> 
    </Image> 
+0

Editar: pensé que eso funcionaría, pero desafortunadamente, las coordenadas X e Y son relativas al evento * last * click, que sucede que está en mi menú contextual, no en la imagen donde hice clic derecho para abrir el menú contextual . – ActualRandy

+0

Sé que es tarde, pero ...podría invocar un comando con el botón derecho de la imagen que envía las coordenadas del mouse y guardarlas en una variable, y luego usar esas coordenadas guardadas si se activa su AddEntryCmd. –

Cuestiones relacionadas