2009-11-08 72 views
6

我正在使用Silverlight 3/C#,並試圖以編程方式創建一些XAML對象,以響應用戶單擊按鈕。如何以編程方式在Silverlight中定位畫布?

不過,我似乎無法定位,我創建了一個Canvas對象 - 當我打電話SetValue()對新CanvasCanvas.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()我已經把後Canvas在XAML樹是這樣的:

myPage.Children.Add(newCanvas); 
    newCanvas.SetValue(Canvas.LeftProperty, 10); 

,但它沒有什麼區別 - 只要SetValue()呼叫被擊中,瀏覽器變成了白色。

除了使用依賴屬性枚舉值的SetValue()函數外,Canvas類似乎沒有直接設置Left/Top的方法。還有Canvas.SetLeft()Canvas.SetTop(),但我想他們只是墊上SetValue()。無論如何,使用它們都無濟於事。

如果我不打電話SetValue(),那麼在SL應用程序中出現我的畫布(以及添加到其中的子對象),如您所期望的,位於左上角。

如果我創建和位置在Expression Blend一個Canvas對象,然後將XAML產生包括在Canvas本身Canvas.LeftCanvas.Top屬性值,如我所期望的,所以在我看來,我想要在C#中應該工作。

但我似乎無法在C#中將自己的左/頂值設置爲沒有瀏覽器中的SL變得奇怪。

任何想法?

編輯:我的方法是正確的,但畫布座標需要浮點,而不是整數 - 請參閱接受的答案以瞭解詳細信息。

回答

13

嘗試你的代碼,但與調試器捕獲異常,我得到:

型System.Double的

的DependencyProperty不能類型System.Int32的對象上設置。

這是一個非常愚蠢的問題 - SetValue只需要Object,所以你很容易出現這樣的問題。

嘗試之一:

newCanvas.SetValue(Canvas.LeftProperty, 10.0); 

Canvas.SetLeft(newCanvas, 10); 

,它可能會工作。

+1

+1好抓,很好看 – AnthonyWJones 2009-11-08 21:37:53

2

附加屬性的行爲起初可能有點混亂。

屬性Canvas.LeftProperty和Canvas.TopProperty應用於畫布的子對象。因此,只有當子對象被放置在Canvas上時,它們纔有意義。理解WPF/SL對象的重要性不在於它自己的位置,它取決於包含面板以決定將它們放在哪裏。

我懷疑myPageCanvas型的沒有,它可能是一個Grid,因此它根本不知道該怎麼做這樣的特性,即使它費心去找他們(這事實並非如此)。

爲了讓您明確定位新帆布,您需要添加它 a帆布。

+0

是的,我花了幾分鐘的時間來確定(Canvas屬性適用於Canvas的子對象),但我知道這一點。 myPage是一個Canvas,就像我在XAML中定義的那樣,並且我剛剛在VS調試器中檢查了this.myPage,以確保在將新Canvas作爲子項添加之前,並且VS報告myPage確實是Canvas對象。 – Slacker 2009-11-08 17:20:09

相關問題