如何以编程方式在Silverlight中定位画布?

时间:2009-11-08 16:27:47

标签: c# silverlight canvas properties position

我正在使用Silverlight 3 / C#,我正在尝试以编程方式创建一些XAML对象以响应用户点击按钮。

但是,当我使用Canvas值调用新SetValue()上的Canvas时,我似乎无法定位我创建的Canvas.LeftProperty对象,浏览器窗口清除为空屏幕。

我有一个简单的函数来展示这个问题(我从一些更复杂的东西开始):

    private Canvas MakeNewCanvas()
    {
        Canvas newCanvas = new Canvas();
        newCanvas.Width = newCanvas.Height = 50;
        newCanvas.SetValue(Canvas.LeftProperty, 10);
        return newCanvas;
    }

和一个简单的按钮点击处理程序,调用它:

    private void MyButton_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        myPage.Children.Add(MakeNewCanvas());
    }

NB :myPage是我应用的MainPage XAML文件中定义的Canvas对象。

我在VS调试器中跟踪了这一点,在Firefox中执行了SL应用程序,每当执行SetValue()行时,浏览器变为白色并开始尝试下载数据(根据状态栏) 。在我将SetValue()放在XAML树中之后,我试着调用Canvas

    myPage.Children.Add(newCanvas);
    newCanvas.SetValue(Canvas.LeftProperty, 10);

但没有区别 - 只要点击SetValue()来电,浏览器就会变白。

Canvas类除了具有依赖项属性枚举值的SetValue()函数外,似乎没有直接设置Left / Top的方法。还有Canvas.SetLeft()Canvas.SetTop(),但我猜他们只是填充SetValue()。无论如何,使用它们并没有帮助。

如果我没有打电话给SetValue(),那么我的画布会在SL应用程序中出现(和我添加到它上面的子对象),如你所料,在最右上方。

如果我在Expression Blend中创建并定位Canvas对象,那么生成的XAML在Canvas.Left本身包含Canvas.TopCanvas属性值,正如我所料,所以在我看来,我在C#中尝试的应该可以工作。

但是我似乎无法在C#中设置左/顶值,而浏览器中的SL并不奇怪。

有什么想法吗?

编辑:我的方法是正确的,但是画布坐标需要是浮点数,而不是整数 - 有关详细信息,请参阅接受的答案。

2 个答案:

答案 0 :(得分:13)

尝试使用代码,但调试器捕获异常,我得到:

无法在System.Int32类型的对象上设置System.Double类型的DependencyProperty。

这是一个非常愚蠢的问题 - SetValue只接受Object,所以你很容易出现这样的问题。

尝试:

newCanvas.SetValue(Canvas.LeftProperty, 10.0);

Canvas.SetLeft(newCanvas, 10);

它可能会起作用。

答案 1 :(得分:2)

首先,附加属性的行为可能会有些混乱。

属性Canvas.LeftProperty和Canvas.TopProperty应用于画布的子对象。因此,只有将子对象放在Canvas上时,它们才有意义。理解WPF / SL对象的重要性不在于它自己的位置,而是由包含面板决定放置它们的位置。

我怀疑myPage不属于Canvas类型,可能是Grid,因此它不知道该怎么处理这些属性,即使它不愿意寻找他们(事实并非如此)。

为了让您专门为新Canvas定位,您需要将添加到画布。