Изменить свойство 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.