2009-11-08 7 views
6

Utilizzo Silverlight 3/C# e sto cercando di creare alcuni oggetti XAML in modo programmatico in risposta a un utente che fa clic su un pulsante.Come posiziono una tela in modo programmatico in Silverlight?

Tuttavia, non riesco a posizionare un oggetto Canvas che ho creato - quando chiamo SetValue() sul nuovo Canvas con il valore Canvas.LeftProperty, la finestra del browser cancella ad uno schermo vuoto.

ho una semplice funzione che presenta il problema (ho iniziato con qualcosa di più complesso):

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

e un gestore di clic semplice pulsante che chiama questo:

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

NB : myPage è un oggetto Canvas definito nel file XAML MainPage della mia app.

Ho tracciato questo nel debugger VS con l'app SL in esecuzione in Firefox, e ogni volta che si esegue la riga SetValue(), il browser diventa bianco e inizia a provare a scaricare i dati (in base alla barra di stato). Ho provato a chiamare SetValue() dopo che ho messo il Canvas nell'albero XAML con qualcosa di simile:

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

ma non fa alcuna differenza - non appena la chiamata SetValue() viene colpito, il browser diventa bianco.

La classe Canvas sembra non avere un metodo diretto per impostare Left/Top su se stesso, ad eccezione della funzione SetValue() con valori di enum delle proprietà di dipendenza. C'è anche Canvas.SetLeft() e Canvas.SetTop() ma immagino che siano solo spessori su SetValue(). Usarli non ha comunque aiutato.

Se non chiamo SetValue(), viene visualizzata la mia tela (e gli oggetti figlio aggiunti) nell'app SL come ci si potrebbe aspettare, in alto a sinistra.

Se genero e la posizione di un oggetto Canvas in Expression Blend, quindi il codice XAML generato include Canvas.Left e Canvas.Top valori delle proprietà sul Canvas stessa, come mi sarei aspettato, così sembra a me che quello che sto cercando in C# dovrebbe lavoro.

Ma io non sembro essere in grado di impostare da solo i valori di sinistra/superiore da C# senza che SL nel browser diventi strano.

Qualche idea?

Modifica: il mio approccio è corretto, ma i canvas coords devono essere in virgola mobile, non integer - vedere la risposta accettata per i dettagli.

risposta

13

Cercando il codice, ma con il debugger cattura eccezioni, ottengo:

DependencyProperty di tipo System.Double non può essere impostato su un oggetto di tipo System.Int32.

che è un trucco davvero stupido - SetValue accetta solo Object, quindi sei incline a un problema come questo.

provare uno:

newCanvas.SetValue(Canvas.LeftProperty, 10.0); 

o

Canvas.SetLeft(newCanvas, 10); 

e probabilmente funzionerà.

+1

+1 Buona cattura, ben individuato – AnthonyWJones

2

Il comportamento delle proprietà collegate può inizialmente creare confusione.

Le proprietà Canvas.LeftProperty e Canvas.TopProperty vengono applicate agli oggetti figlio di una tela. Pertanto sono significativi solo quando l'oggetto figlio è posizionato su un Canvas. È importante capire che gli oggetti in WPF/SL non si posizionano, fino al pannello di contenimento per decidere dove metterli.

ho il sospetto che il myPage non è del tipo Canvas, la sua, probabilmente un Grid, quindi sarebbe alcuna idea di cosa fare con tali proprietà, anche se la briga di cercare per loro (che non è così).

Per posizionare in modo specifico la nuova tela, è necessario aggiungerla a a una tela.

+0

Sì, mi ci sono voluti alcuni minuti per capire che (le proprietà della tela si applicano agli oggetti figlio di Canvas), ma lo so. myPage è un Canvas, come definito nel mio XAML, e ho appena esaminato questo.myPage nel debugger VS per essere sicuro appena prima di aggiungere il nuovo Canvas da bambino, e VS ha riferito che myPage è in effetti un oggetto Canvas. – Slacker

Problemi correlati