Изменить свойство 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);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.