2009-11-08 76 views
6

我正在使用Silverlight 3/C#,并试图以编程方式创建一些XAML对象,以响应用户单击按钮。如何以编程方式在Silverlight中定位画布?

不过,我似乎无法定位,我创建了一个Canvas对象 - 当我打电话SetValue()对新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()); 
    } 

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

我已经通过在VS调试器在Firefox执行SL应用程序跟踪这一点,一旦它执行SetValue()线,浏览器变成了白色,并开始尝试下载数据(根据状态栏)。我打过电话SetValue()我已经把后Canvas在XAML树是这样的:

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

,但它没有什么区别 - 只要SetValue()呼叫被击中,浏览器变成了白色。

除了使用依赖属性枚举值的SetValue()函数外,Canvas类似乎没有直接设置Left/Top的方法。还有Canvas.SetLeft()Canvas.SetTop(),但我想他们只是垫上SetValue()。无论如何,使用它们都无济于事。

如果我不打电话SetValue(),那么在SL应用程序中出现我的画布(以及添加到其中的子对象),如您所期望的,位于左上角。

如果我创建和位置在Expression Blend一个Canvas对象,然后将XAML产生包括在Canvas本身Canvas.LeftCanvas.Top属性值,如我所期望的,所以在我看来,我想要在C#中应该工作。

但我似乎无法在C#中将自己的左/顶值设置为没有浏览器中的SL变得奇怪。

任何想法?

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

回答

13

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

型System.Double的

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

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

尝试之一:

newCanvas.SetValue(Canvas.LeftProperty, 10.0); 

Canvas.SetLeft(newCanvas, 10); 

,它可能会工作。

+1

+1好抓,很好看 – AnthonyWJones 2009-11-08 21:37:53

2

附加属性的行为起初可能有点混乱。

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

我怀疑myPageCanvas型的没有,它可能是一个Grid,因此它根本不知道该怎么做这样的特性,即使它费心去找他们(这事实并非如此)。

为了让您明确定位新帆布,您需要添加它 a帆布。

+0

是的,我花了几分钟的时间来确定(Canvas属性适用于Canvas的子对象),但我知道这一点。 myPage是一个Canvas,就像我在XAML中定义的那样,并且我刚刚在VS调试器中检查了this.myPage,以确保在将新Canvas作为子项添加之前,并且VS报告myPage确实是Canvas对象。 – Slacker 2009-11-08 17:20:09

相关问题