2009-11-08 9 views
6

Używam Silverlight 3/C# i próbuję programowo utworzyć niektóre obiekty XAML w odpowiedzi na kliknięcie przycisku przez użytkownika.Jak programowo umieścić płótno w Silverlight?

Jednak nie wydaje się pozycjonować Canvas obiekt, który stworzyłem - gdy zgłoszę SetValue() na nowym Canvas o wartości Canvas.LeftProperty, okno przeglądarki ściąga do pustego ekranu.

mam prostą funkcję, która wykazuje problem (Zacząłem z czymś bardziej złożonym):

private Canvas MakeNewCanvas() 
    { 
     Canvas newCanvas = new Canvas(); 
     newCanvas.Width = newCanvas.Height = 50; 
     newCanvas.SetValue(Canvas.LeftProperty, 10); 
     return newCanvas; 
    } 

i kliknij obsługi prosty przycisk, który wywołuje to:

private void MyButton_Click(object sender, System.Windows.RoutedEventArgs e) 
    { 
     myPage.Children.Add(MakeNewCanvas()); 
    } 

NB : myPage to obiekt Canvas zdefiniowany w pliku XAML MainPage aplikacji.

Prześledziłem to przez debuggera VS z aplikacją SL w Firefoksie, a gdy tylko wykona ona linię SetValue(), przeglądarka świeci się na biało i rozpoczyna pobieranie danych (zgodnie z paskiem stanu). Próbowałem nazywając SetValue() po mam umieścić Canvas w drzewie XAML z czymś takim:

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

ale to nie ma znaczenia - tak szybko, jak wywołanie SetValue() jest trafiony, przeglądarka przechodzi biały.

Wydaje się, że klasa Canvas nie ma bezpośredniej metody ustawiania Left/Top na sobie, z wyjątkiem funkcji SetValue() z wartościami wyliczeniowymi właściwości zależności. Jest też Canvas.SetLeft() i Canvas.SetTop(), ale domyślam się, że po prostu podpierają się na SetValue(). Korzystanie z nich i tak nie pomogło.

Jeśli nie zadzwonię pod numer SetValue(), pojawi się moje płótno (i obiekty podrzędne, które dodałem do niego) w aplikacji SL, jak można się spodziewać, w lewym górnym rogu.

Jeśli tworzę i położenie a Canvas obiekt w Expression Blend, następnie XAML generowane obejmuje Canvas.Left i Canvas.Top wartości nieruchomości na samej Canvas, jak bym się spodziewał, więc wydaje mi się, że to, co usiłuję w C# powinien praca.

Ale wydaje mi się, że nie jestem w stanie ustawić wartości lewej/górnej samodzielnie z C# bez SL w przeglądarce wszystko będzie dziwne.

Wszelkie pomysły?

Edytuj: moje podejście jest poprawne, ale współrzędne na płótnie muszą być zmiennoprzecinkowe, a nie całkowite - zobacz akceptowaną odpowiedź, aby poznać szczegóły.

Odpowiedz

13

Próbując swój kod, ale debugger łapanie wyjątków, otrzymuję:

DependencyProperty typu System.Double nie może być ustawiona na obiekcie typu System.Int32.

co jest naprawdę głupi haczyka - SetValue zajmuje tylko obiekt, więc jesteś podatny na problem jak ten.

Spróbuj albo:

newCanvas.SetValue(Canvas.LeftProperty, 10.0); 

lub

Canvas.SetLeft(newCanvas, 10); 

i to prawdopodobnie będzie działać.

+1

+1 Dobry połów, dobrze nakrapiany – AnthonyWJones

2

Zachowanie załączonych właściwości może być początkowo nieco mylące.

Właściwości Canvas.LeftProperty i Canvas.TopProperty są stosowane do obiektów potomnych płótna. Są one zatem znaczące tylko wtedy, gdy obiekt potomny jest umieszczony na Canvas. Ważne jest, aby zrozumieć, że obiekty WPF/SL nie ustawiają się same, a do panelu zawierającego decydują, gdzie je umieścić.

podejrzewam myPage nie jest typu Canvas, jego prawdopodobnie Grid, stąd też nie miałby pojęcia, co zrobić z takimi właściwościami, nawet jeśli chciało się patrzeć na nich (co nie robi).

Abyś mógł konkretnie ustawić nowe płótno, musisz je dodać: do a Canvas.

+0

Tak, zajęło mi kilka minut, aby zrozumieć, że (właściwości Canvas stosuje się do obiektów podrzędnych płótnie), ale wiem, że. Mypage jest Płótno, jak określono w moim XAML, a ja po prostu zbadać this.myPage w debugger VS, aby upewnić się tuż przed dodaję nowe Canvas jako dziecko, i VS poinformował, że Mypage jest rzeczywiście obiekt Canvas. – Slacker