Cambiar la propiedad Canvas.Left en el código detrás?

98

Tengo un rectángulo en mi XAML y quiero cambiar su Canvas.Leftpropiedad en el código detrás:

<UserControl x:Class="Second90.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300" KeyDown="txt_KeyDown">
    <Canvas>
        <Rectangle 
            Name="theObject" 
            Canvas.Top="20" 
            Canvas.Left="20" 
            Width="10" 
            Height="10" 
            Fill="Gray"/>
    </Canvas>
</UserControl>

Pero esto no funciona:

private void txt_KeyDown(object sender, KeyEventArgs e)
{
    theObject.Canvas.Left = 50;
}

¿Alguien sabe cuál es la sintaxis para hacer esto?

Edward Tanguay
fuente

Respuestas:

165
Canvas.SetLeft(theObject, 50)

AnthonyWJones
fuente
+1, tengo que amar la seguridad de tipos. Sin embargo, tengo curiosidad por saber por qué SetLeft toma un UIElement en lugar de un DependencyObject
JaredPar
4
@JaredPar: supongo que diría que dado que SetLeft es específicamente un método de Canvas, comprende a qué tipos tendría sentido asignar una propiedad Left. Considera que esto es UIElement, esto quizás aumente la detección de código defectuoso donde accidentalmente se le pasa la variable incorrecta.
AnthonyWJones
msdn.microsoft.com/en-us/library/… Canvas.Left es una propiedad adjunta que admite el uso de XAML. Cuando establezca esta propiedad en el código, use SetLeft en su lugar.
Yury Schkatula
50

Prueba esto

theObject.SetValue(Canvas.LeftProperty, 50d);

Hay un grupo de métodos en DependencyObject (base de la mayoría de las clases de WPF) que permiten el acceso común a todas las propiedades de dependencia. Son

  • Valor ajustado
  • GetValue
  • ClearValue

Editar Se actualizó el conjunto para usar un literal doble ya que el tipo de destino es un doble.

JaredPar
fuente
Gracias, para que esto funcionara tuve que lanzar el entero: theObject.SetValue (Canvas.LeftProperty, (double) 50);
Edward Tanguay
No, para esto especifique una constante numérica en formato doble: heObject.SetValue (Canvas.LeftProperty, 50.0);
Budda
12

Como estamos cambiando la propiedad del 'objeto', sería mejor usar el método sugerido por JaredPar:

theObject.SetValue(Canvas.LeftProperty, 50d);
Budda
fuente