我正在使用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.Top
和Canvas
属性值,正如我所料,所以在我看来,我在C#中尝试的应该可以工作。
但是我似乎无法在C#中设置左/顶值,而浏览器中的SL并不奇怪。
有什么想法吗?
编辑:我的方法是正确的,但是画布坐标需要是浮点数,而不是整数 - 有关详细信息,请参阅接受的答案。
答案 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定位,您需要将添加到画布。