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

Sla*_*ker 6 c# silverlight position canvas properties

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

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

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

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

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

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

注意:myPage是我的应用程序的MainPage XAML文件中定义的Canvas对象.

我已经在VS调试器中跟踪了这一点,并且在Firefox中执行了SL应用程序,并且无论何时执行该SetValue()行,浏览器都会变白并开始尝试下载数据(根据状态栏).SetValue()在我将CanvasXAML树放入以下内容之后,我尝试了调用:

    myPage.Children.Add(newCanvas);
    newCanvas.SetValue(Canvas.LeftProperty, 10);
Run Code Online (Sandbox Code Playgroud)

但它没有任何区别 - 一旦SetValue()呼叫被击中,浏览器就会变白.

Canvas级似乎对自身设置左/顶,除了没有直接的方法SetValue()与依赖属性枚举值的功能.还有Canvas.SetLeft(),Canvas.SetTop()但我想他们只是垫片SetValue().无论如何,使用它们并没有帮助.

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

如果我Canvas在Expression Blend中创建并定位一个对象,那么XAML就会生成包含Canvas.Left和自身的Canvas.Top属性值Canvas,正如我所料,所以在我看来,我在C#中尝试的应该是有效的.

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

有任何想法吗?

编辑:我的方法是正确的,但画布坐标需要是浮点数,而不是整数 - 请参阅接受的答案了解详情.

小智 13

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

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

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

尝试:

newCanvas.SetValue(Canvas.LeftProperty, 10.0);
Run Code Online (Sandbox Code Playgroud)

要么

Canvas.SetLeft(newCanvas, 10);
Run Code Online (Sandbox Code Playgroud)

它可能会奏效.