![](/img/trans.png)
[英]How do I get or set the position of an image on a Silverlight Canvas control
[英]How do I programmatically position a canvas in Silverlight?
我正在使用Silverlight 3 / C#,並且嘗試通過編程方式創建一些XAML對象,以響應用戶單擊按鈕的情況。
但是,我似乎無法放置已創建的Canvas
對象-當我使用Canvas.LeftProperty
值在新的Canvas
上調用SetValue()
時,瀏覽器窗口將清除為空白屏幕。
我有一個顯示問題的簡單函數(我從更復雜的東西開始):
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());
}
注意 :myPage是在應用程序的MainPage XAML文件中定義的Canvas對象。
我已經在VS調試器中通過在Firefox中執行SL應用程序進行了追溯,每當它執行SetValue()
行時,瀏覽器就會變白並開始嘗試下載數據(根據狀態欄)。 在將Canvas
放入XAML樹中之后,我嘗試調用SetValue()
,例如:
myPage.Children.Add(newCanvas);
newCanvas.SetValue(Canvas.LeftProperty, 10);
但這沒有什么區別-按下SetValue()
調用后,瀏覽器就會變白。
除了具有依賴項屬性枚舉值的SetValue()
函數之外, Canvas
類似乎沒有直接在其自身上設置Left / Top的方法。 還有Canvas.SetLeft()
和Canvas.SetTop()
但我想它們只是Canvas.SetTop()
到SetValue()
。 無論如何,使用它們無濟於事。
如果我不調用SetValue()
,那么我的畫布(以及我添加到其中的子對象)將如您所願地顯示在SL應用的左上方。
如果我在Expression Blend中創建Canvas
對象並將其定位,那么生成的XAML就會像我期望的那樣在Canvas
本身上包含Canvas.Left
和Canvas.Top
屬性值,因此在我看來,我在C#中嘗試的操作應該工作。
但是,如果沒有瀏覽器中的SL變得很奇怪,我似乎無法通過C#自己設置左/上值。
有任何想法嗎?
編輯:我的方法是正確的,但是畫布坐標必須是浮點數,而不是整數-有關詳細信息,請參見接受的答案。
嘗試您的代碼,但是調試器捕獲到異常,我得到:
無法在類型System.Int32的對象上設置System.Double類型的DependencyProperty。
這是一個非常愚蠢的陷阱-SetValue僅采用Object,因此您很容易遇到這樣的問題。
嘗試以下任一方法:
newCanvas.SetValue(Canvas.LeftProperty, 10.0);
要么
Canvas.SetLeft(newCanvas, 10);
它可能會起作用。
附加屬性的行為起初可能有些混亂。
屬性Canvas.LeftProperty和Canvas.TopProperty應用於畫布的子對象。 因此,僅當將子對象放置在Canvas
上時,它們才有意義。 重要的是要了解WPF / SL中的對象不要自行放置,而是由包含面板的對象決定放置它們的位置。
我懷疑myPage
不是Canvas
類型的,它可能是Grid
,因此,即使它費心尋找它們(也不是),也不知道如何處理這些屬性。
為了使您特定地放置新畫布,您需要將其添加到畫布中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.