2011-01-05 14 views
6

Quiero agregar la ruta WPF a InkCanvas y usar la selección para seleccionar la ruta WPF. Entonces, uso este código.¿Por qué ActualWidth y ActualHeight comienzan desde 0,0?

System.Windows.Shapes.Path path = drawCanvas.Children[i] as System.Windows.Shapes.Path;  
drawCanvas.Children.RemoveAt(i); 
inkCanvas.Children.Add(path); 

Esta es la salida. Tengo que seleccionar la ruta WPF de 0,0 porque Actualwidth y ActualHeight comienzan desde 0,0.

alt text

¿Cómo selecciono absoluta Ruta WPF?

Gracias

Editar:

Ahora, puedo seleccionarlo absolutamente mediante el uso de este código.

System.Windows.Shapes.Path path = drawCanvas.Children[i] as System.Windows.Shapes.Path; 
drawCanvas.Children.RemoveAt(i); 
path.Margin = new Thickness(-getMinX(path), -getMinY(path), 0, 0); 
containPath.Children.Add(path); 
containPath.Width = getMaxX(path) - getMinX(path); 
containPath.Height = getMaxY(path) - getMinY(path); 
containPath.Margin = new Thickness(getMinX(path), getMinY(path), 0, 0); 
inkCanvas.Children.Add(containPath); 

Respuesta

4

Puede utilizar el UIElement.UpdateLayout Method en el InkCanvas para actualizar el FrameworkElement.ActualWidth Property y ActualHeight. Consulte el enlace ActualWidth para obtener información general sobre por qué es necesario.

Editar:

no he entendido bien la pregunta. No era que ActualWidth y ActualHeight eran cero, pero que sus valores eran relativos a (0, 0) en el InkCanvas. A bastante buena solución al problema es envolver el Path en un Canvas y posicionarlo usando Margin como esto:

<Canvas Width="50" Height="50" Margin="200,200,0,0"> 
    <Line 
     X1="0" Y1="0" 
     X2="50" Y2="50" 
     Stroke="Black" 
     StrokeThickness="4" /> 
</Canvas> 

que se comporta como:

alt text

La desventaja de este enfoque es la el usuario tiene que enlazar el Canvas que es un rectángulo, no una forma arbitraria. Sin embargo, es mucho mejor que tener que enlazar el objeto y con el origen.

+0

No creo que UpdateLayout haga nada. – NVM

+0

No tenemos el código suficiente para probar la teoría, pero si 'UIElement.IsMeasureValid' es' false', no hay ninguna esperanza de que 'ActualWidth' y 'ActualHeight' sean correctos. –

+0

Por favor, mira mi respuesta. En mi comentario anterior quise decir que UpdateLayout no hará nada por un 'Path' – NVM

0

Para los elementos que sólo se puede definir a través de puntos de control (por ejemplo, línea, una ruta, etc, frente rectángulo, elipse, etc.) cuando se agrega a un control de elementos (que supongo que la InkCanvas es, ya que es compatible con la selección), en primer lugar una lienzo se agrega al panel a 0,0. El ancho y el Height del lienzo se determinan a partir de las coordenadas X e Y máximas de los puntos de control. Después de esto, el elemento se agrega como elemento secundario de este lienzo.

También verá que cada vez que vea este tipo de comportamientos con un elemento, el elemento suele apoyar Propiedades de diseño como la alineación horizontal/vertical etc.

La única manera que veo en todo esto es encontrar la ActualWidth y ActualHeight manualmente desde las coordenadas en la ruta.

Editar: Esto es por experiencia personal y no de cualquier documentación.

+0

Puedo encontrar ActualWidth y ActualHeight manualmente ahora. Pero no puedo establecerlos en ActualWidth y ActualHeight porque son de solo lectura. –

+0

ActualWidth y ActualHeight son propiedades de solo lectura de dependencia (si la memoria funciona correctamente). Usted simplemente no puede y no debe configurarlo usted mismo. – NVM

+1

Para la selección de adornos, tendrás que hacer muchas cosas manuales para hacer lo que quieras. Cuando agrega un artículo a un inkcanvas, se lo envolverá en un artículo contenedor. Este artículo contenedor es lo que está decorado por la selección adorner. Como su contenedor contiene el lienzo que comienza en 0,0, verá el cuadro de selección impar. Debe crear un elemento contenedor derivado que se encargue de la selección de adornos usted mismo. – NVM

Cuestiones relacionadas