Czy zmienić właściwość Canvas.Left w kodzie?

98

Mam prostokąt w moim XAML i chcę zmienić jego Canvas.Leftwłaściwość w kodzie za:

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

Ale to nie działa:

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

Czy ktoś wie, jaka jest składnia, aby to zrobić?

Edward Tanguay
źródło

Odpowiedzi:

165
Canvas.SetLeft(theObject, 50)

AnthonyWJones
źródło
+1, muszę kochać bezpieczeństwo typu. Jestem jednak ciekawy, dlaczego SetLeft przyjmuje UIElement zamiast DependencyObject
JaredPar
4
@JaredPar: zgaduję, że skoro SetLeft jest konkretnie metodą Canvas, rozumie, jakie typy miałoby sens nadanie właściwości Left. Uważa to za UIElement, co prawdopodobnie zwiększa wykrywanie błędnego kodu, gdy przypadkowo przekazywana jest do niego niewłaściwa zmienna.
AnthonyWJones
msdn.microsoft.com/en-us/library/… Canvas.Left to dołączona właściwość, która obsługuje użycie języka XAML. Podczas ustawiania tej właściwości w kodzie należy zamiast tego użyć SetLeft.
Yury Schkatula
50

Spróbuj tego

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

Na DependencyObject (podstawa większości klas WPF) znajduje się grupa metod, które umożliwiają wspólny dostęp do wszystkich właściwości zależności. Oni są

  • Ustalić wartość
  • GetValue
  • ClearValue

Edycja Zaktualizowano zestaw, aby używał podwójnego literału, ponieważ typ docelowy jest podwójny.

JaredPar
źródło
Dzięki, aby to zadziałało, musiałem rzucić liczbę całkowitą: theObject.SetValue (Canvas.LeftProperty, (double) 50);
Edward Tanguay,
Nie, w tym celu określ stałą numeryczną w podwójnym formacie: heObject.SetValue (Canvas.LeftProperty, 50.0);
Budda
12

Ponieważ zmieniamy właściwość `` obiektu '', lepiej byłoby użyć metody suggedte od JaredPar:

theObject.SetValue(Canvas.LeftProperty, 50d);
Budda
źródło