簡體   English   中英

如何以編程方式在Silverlight中放置畫布?

[英]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.LeftCanvas.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM