C# 如何以编程方式在Silverlight中定位画布?
我使用的是Silverlight 3/C#,我试图通过编程方式创建一些XAML对象,以响应用户单击按钮 但是,我似乎无法定位我创建的C# 如何以编程方式在Silverlight中定位画布?,c#,silverlight,canvas,properties,position,C#,Silverlight,Canvas,Properties,Position,我使用的是Silverlight 3/C#,我试图通过编程方式创建一些XAML对象,以响应用户单击按钮 但是,我似乎无法定位我创建的Canvas对象-当我使用Canvas.LeftProperty值在新的Canvas上调用SetValue()时,浏览器窗口将清空为空屏幕 我有一个显示问题的简单函数(我从更复杂的东西开始): 还有一个简单的按钮点击处理程序,它调用: private void MyButton_Click(object sender, System.Windows.Rout
Canvas
对象-当我使用Canvas.LeftProperty
值在新的Canvas
上调用SetValue()
时,浏览器窗口将清空为空屏幕
我有一个显示问题的简单函数(我从更复杂的东西开始):
还有一个简单的按钮点击处理程序,它调用:
private void MyButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
myPage.Children.Add(MakeNewCanvas());
}
NB:myPage是在我的应用程序的主页XAML文件中定义的画布对象
我在VS调试器中跟踪了这一点,SL应用程序在Firefox中执行,每当它执行SetValue()
行时,浏览器就会变白并开始尝试下载数据(根据状态栏)。在将Canvas
放入XAML树后,我尝试调用SetValue()
,如下所示:
myPage.Children.Add(newCanvas);
newCanvas.SetValue(Canvas.LeftProperty, 10);
但是这没有什么区别——只要点击SetValue()
调用,浏览器就会变白
Canvas
类似乎没有在自身上设置Left/Top的直接方法,除了带有依赖属性enum值的SetValue()
函数之外。还有Canvas.SetLeft()
和Canvas.SetTop()
但我想它们只是SetValue()
上的垫片。使用它们也没有任何帮助
如果我不调用SetValue()
,那么我的画布(以及我添加到画布中的子对象)会如您所料出现在SL应用程序的左上方
如果我在Expression Blend中创建并定位Canvas
对象,那么生成的XAML包括Canvas.Left
和Canvas.Top
属性值在Canvas
本身上,正如我所期望的那样,因此在我看来,我在C#中尝试的应该是可行的
但是,如果浏览器中的SL不正常,我似乎无法从C#设置左/顶值
有什么想法吗
编辑:我的方法是正确的,但画布坐标必须是浮点,而不是整数-有关详细信息,请参阅公认的答案。附加属性的行为一开始可能会有点混乱 属性Canvas.LeftProperty和Canvas.TopProperty应用于画布的子对象。因此,只有当子对象放置在
画布上时,它们才有意义。重要的是要理解WPF/SL中的对象不会自行定位,而是由包含它们的面板决定将它们放置在何处
我怀疑myPage
不是Canvas
类型,它可能是一个Grid
,因此它不知道如何处理这些属性,即使它费心寻找它们(它没有)
为了明确定位新画布,您需要将其添加到画布中。尝试代码,但在调试器捕获异常的情况下,我得到:
无法在System.Int32类型的对象上设置System.Double类型的DependencyProperty
这是一个非常愚蠢的问题,SetValue只接受对象,所以您很容易出现这样的问题
尝试以下任一方法:
newCanvas.SetValue(Canvas.LeftProperty, 10.0);
或
是的,我花了几分钟才弄明白(画布属性适用于画布的子对象),但我知道这一点。myPage是一个画布,正如在我的XAML中定义的那样,我刚刚在VS调试器中检查了this.myPage,以确保在我将新画布作为子对象添加之前,VS报告myPage确实是一个画布对象。
newCanvas.SetValue(Canvas.LeftProperty, 10.0);
Canvas.SetLeft(newCanvas, 10);