Изменить свойство Canvas.Left в коде позади?

98

У меня есть прямоугольник в моем XAML, и я хочу изменить его Canvas.Leftсвойство в коде позади:

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

Но это не работает:

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

Кто-нибудь знает, какой для этого синтаксис?

Эдвард Тангуай
источник

Ответы:

165
Canvas.SetLeft(theObject, 50)

ЭнтониУДжонс
источник
+1, надо любить безопасность типа. Мне любопытно, почему SetLeft принимает UIElement вместо DependencyObject
JaredPar
4
@JaredPar: предположительно, я бы сказал, что, поскольку SetLeft - это именно метод Canvas, он понимает, какие типы имеют смысл давать свойство Left. Он считает это UIElement, что, возможно, увеличивает обнаружение ошибочного кода, когда ему случайно передается неправильная переменная.
AnthonyWJones,
msdn.microsoft.com/en-us/library/… Canvas.Left - это присоединенное свойство, которое поддерживает использование XAML. При установке этого свойства в коде используйте вместо этого SetLeft.
Юрий Щкатула 04
50

Попробуй это

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

В DependencyObject (база большинства классов WPF) есть группа методов, которые обеспечивают общий доступ ко всем свойствам зависимостей. Они есть

  • SetValue
  • GetValue
  • ClearValue

Изменить Обновлен набор для использования двойного литерала, поскольку целевой тип - двойной.

ДжаредПар
источник
Спасибо, чтобы заставить это работать, мне пришлось привести целое число: theObject.SetValue (Canvas.LeftProperty, (double) 50);
Эдвард Тангуай,
Нет, для этого укажите числовую константу в формате double: heObject.SetValue (Canvas.LeftProperty, 50.0);
Budda
12

Поскольку мы меняем свойство «объекта», было бы лучше использовать метод, предложенный JaredPar:

theObject.SetValue(Canvas.LeftProperty, 50d);
Будда
источник