在代码后台更改Canvas.Left属性?

103

我在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;
}

有没有人知道如何编写语法来完成这个操作?

3个回答

171
Canvas.SetLeft(theObject, 50)


+1,一定要喜欢类型安全。不过我很好奇为什么SetLeft需要一个UIElement而不是DependencyObject。 - JaredPar
4
我猜测,由于SetLeft是Canvas的特定方法,它理解赋予Left属性给哪些类型是有意义的。它认为这应该是UIElement,这可能增加了检测错误代码的能力,以防意外地将错误的变量传递给它。 - AnthonyWJones
Canvas.Left是一种附加属性,支持XAML语法。在代码中设置此属性时,请使用SetLeft。 - Yury Schkatula

57

试试这个

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

在大多数WPF类的基础DependencyObject上,有一组方法允许对所有依赖属性进行通用访问。它们是:

  • SetValue
  • GetValue
  • ClearValue

编辑:由于目标类型为double,因此将设置更改为使用双精度文字。


谢谢,为了让它正常工作,我不得不将整数转换为double类型:theObject.SetValue(Canvas.LeftProperty, (double)50); - Edward Tanguay
不,要使用双精度格式指定数值常量: heObject.SetValue(Canvas.LeftProperty, 50.0); - Budda

12

由于我们正在更改“对象”的属性,因此最好使用JaredPar建议的方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接