2009-06-30 21 views
10

mi proyecto actual de tiempo libre, para bucear en WPF MVVM, es una copia "digital" de un viejo rompecabezas que solía jugar mucho en mi infancia. Básicamente es un rompecabezas simple donde uno tiene que llenar un espacio dado con diferentes tipos de piezas para que todo el espacio se llene. Pero con el giro extra de estar en el espacio hexagonal.Controles de ajuste de WPF

Sólo para ilustrar, esto es lo que se ve actualmente como en WPF:

http://img190.imageshack.us/img190/2553/atomgridmolecule.png

Así que, básicamente, hay un número de piezas predefinidas (como el naranja arriba) que pueden ser "conectados" en la grilla dada (las cosas grises arriba).

Así, el resultado podría ser algo como esto:

http://img30.imageshack.us/img30/2553/atomgridmolecule.png

quiero que el usuario (probablemente sólo me ^^) para ser capaz de arrastrar y soltar las piezas a la red. Quiero que el arrastre parezca natural con el desplazamiento correcto mientras se arrastra dependiendo de dónde el usuario hizo clic en la pieza.

Tanto la cuadrícula como la molécula tienen el mismo control, un control de panel hexagonal personalizado derivado de la clase de panel de WPF.

El problema está en cómo "enchufar" y especialmente en "desenchufar".

Tengo dos ideas sobre cómo podría hacer frente a este:

  1. sólo el color de las celdas de la cuadrícula y ocultar la pieza original
    • Pro:
      • cero costo perfecta alineación de las celdas
    • Contras:
      • ¿Volver a crear la pieza en el lugar correcto con la compensación correcta del mouse si se arrastra hacia afuera, parece imposible? difícil de hacer
  2. de rotura de la pieza a la red, el documento presentado en la parte superior
    • Pro:
      • arrastrando a cabo es una operación de arrastre simple, al igual que arrastra en
    • Desventaja:
      • De alguna manera tiene que alinear la pieza con la red subyacente, una especie de romperse

Así qué enfoque debería tomar? Aún más importante, ¿cómo puedo incluso implementar esto en WPF? Especialmente usando una forma limpia de MVVM.


Muchas gracias por su ayuda! Cualquier entrada es muy apreciada!

EDITAR:
Gracias Aran, yo también lo pensé.

Pero cómo implementar esta realidad ahora?

  • ¿Cómo puedo obtener las coordenadas?
  • Todos los círculos anaranjados están vinculados, entonces ¿cómo puedo "moverlos" o mejor "enchufarlos" de una sola pieza?

Respuesta

1

Im inclinado a ir con la segunda idea. un simple ajuste sería simplemente probar si el punto central del círculo que está arrastrando está dentro de algún factor de tolerancia de un círculo en la cuadrícula y, de ser así, ajustarlos.

+1

me gustaría hacer esto - En el código de ver detrás del evento final del ratón, haga clic en cada círculo de color naranja, a continuación, comparar el círculo naranja x, y de la lista de todos círculo gris x, y. Ajústate al punto más cercano ajustando el círculo naranja x, y. –

+0

Ok, yo también lo pensé. ¿Pero cómo lo implementaría realmente? – eric

+0

¿Sabes cómo comparar la distancia entre dos puntos? "2 + b 2 = c2" Mira esto, si necesita más información: http://www.purplemath.com/modules/distform.htm esta fórmula en particular es el que se necesita aquí: http: // www .purplemath.com/módulos/xyplane/dist07b.gif – Giffyguy

Cuestiones relacionadas