【问题标题】:How do I programmatically position a canvas in Silverlight?如何以编程方式在 Silverlight 中定位画布?
【发布时间】:2010-12-14 09:36:18
【问题描述】:

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

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

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

    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() 行时,浏览器就会变白并开始尝试下载数据(根据状态栏)。在将 Canvas 放入 XAML 树中后,我尝试调用 SetValue(),如下所示:

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

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

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

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

如果我在 Expression Blend 中创建并定位 Canvas 对象,则生成的 XAML 包括 Canvas 本身的 Canvas.LeftCanvas.Top 属性值,正如我所期望的那样,所以在我看来,什么我在 C# 中尝试应该可以工作。

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

有什么想法吗?

编辑:我的方法是正确的,但画布坐标必须是浮点数,而不是整数 - 详情请参阅已接受的答案。

【问题讨论】:

    标签: c# silverlight canvas properties position


    【解决方案1】:

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

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

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

    试试:

    newCanvas.SetValue(Canvas.LeftProperty, 10.0);
    

    Canvas.SetLeft(newCanvas, 10);
    

    它可能会起作用。

    【讨论】:

      【解决方案2】:

      附加属性的行为一开始可能有点令人困惑。

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

      我怀疑myPage 不是Canvas 类型,它可能是Grid,因此即使它费心寻找它们也不知道如何处理这些属性(它不会' t)。

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

      【讨论】:

      • 是的,我花了几分钟才弄清楚(Canvas 属性适用于 Canvas 的子对象),但我知道这一点。 myPage 是一个 Canvas,正如我的 XAML 中所定义的那样,我刚刚在 VS 调试器中检查了 this.myPage 以确保在我将新 Canvas 添加为子对象之前,VS 报告 myPage 确实是一个 Canvas 对象。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 2012-11-22
      相关资源
      最近更新 更多