Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以编程方式在Silverlight中定位画布?_C#_Silverlight_Canvas_Properties_Position - Fatal编程技术网

C# 如何以编程方式在Silverlight中定位画布?

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

我使用的是Silverlight 3/C#,我试图通过编程方式创建一些XAML对象,以响应用户单击按钮

但是,我似乎无法定位我创建的
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);