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?

Respuestas:


165
Canvas.SetLeft(theObject, 50)


+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.


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);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.