Sla*_*ker 6 c# silverlight position canvas properties
我正在使用Silverlight 3/C#,我正在尝试以编程方式创建一些XAML对象以响应用户单击按钮.
但是,我似乎无法定位Canvas
我创建的对象 - 当我使用值调用SetValue()
new Canvas
时Canvas.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()
在我将Canvas
XAML树放入以下内容之后,我尝试了调用:
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)
它可能会奏效.