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.
+1 Dobry połów, dobrze nakrapiany – AnthonyWJones