6

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

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

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

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

我已经在 VS 调试器中跟踪了这一点,SL 应用程序在 Firefox 中执行,每当它执行该SetValue()行时,浏览器就会变白并开始尝试下载数据(根据状态栏)。在将 XAML 树SetValue()放入类似以下内容后,我尝试调用:Canvas

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

但这没有什么区别 - 一旦SetValue()调用,浏览器就会变白。

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

如果我不调用SetValue(),那么我的画布(以及我添加到其中的子对象)会如您所料出现在 SL 应用程序的左上角。

如果我Canvas在 Expression Blend 中创建和定位一个对象,那么生成的 XAML 会在其自身上包含Canvas.LeftCanvas.Top属性值Canvas,正如我所期望的那样,所以在我看来,我在 C# 中尝试的应该可以工作。

但是如果浏览器中的 SL 变得很奇怪,我似乎无法自己从 C# 设置左/上值。

有任何想法吗?

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

4

2 回答 2

14

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

System.Double 类型的 DependencyProperty 不能在 System.Int32 类型的对象上设置。

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

尝试:

newCanvas.SetValue(Canvas.LeftProperty, 10.0);

或者

Canvas.SetLeft(newCanvas, 10);

它可能会起作用。

于 2009-11-08T17:50:21.077 回答
2

附加属性的行为起初可能有点令人困惑。

属性 Canvas.LeftProperty 和 Canvas.TopProperty 应用于画布的子对象。因此,它们仅在子对象放置在 时才有意义Canvas。重要的是要了解 WPF/SL 中的对象不会自行定位,这取决于包含面板来决定将它们放在哪里。

我怀疑 themyPage不是Canvas那种类型,它可能是 a Grid,因此即使它费心寻找它们(它没有),它也不知道如何处理这些属性。

为了让您专门定位新的 Canvas,您需要将其添加Canvas。

于 2009-11-08T16:41:23.477 回答