Ich benutze Silverlight 3/C#, und ich versuche, einige XAML-Objekte als Reaktion auf einen Benutzer auf eine Schaltfläche programmatisch zu erstellen.Wie programmiere ich eine Leinwand in Silverlight?
Allerdings kann ich nicht ein Canvas
Objekt zu positionieren scheinen die ich geschaffen habe - wenn ich SetValue()
auf dem neuen Canvas
mit dem Canvas.LeftProperty
Wert aufrufen, löscht der Browser-Fenster auf einen leeren Bildschirm.
ich eine einfache Funktion, die das Problem aufweist (Ich begann mit etwas komplexer):
private Canvas MakeNewCanvas()
{
Canvas newCanvas = new Canvas();
newCanvas.Width = newCanvas.Height = 50;
newCanvas.SetValue(Canvas.LeftProperty, 10);
return newCanvas;
}
und einem einfachen Button-Klick-Handler, der diese Anrufe:
private void MyButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
myPage.Children.Add(MakeNewCanvas());
}
NB : myPage ist ein Canvas-Objekt, das in der MainPage XAML-Datei meiner App definiert ist.
Ich habe dies in der VS-Debugger mit der SL-Anwendung in Firefox ausgeführt, und wenn es die Zeile SetValue()
ausführt, wird der Browser weiß und beginnt zu versuchen, Daten zu downloaden (gemäß der Statusleiste). Ich habe versucht Aufruf SetValue()
, nachdem ich die Canvas
im XAML Baum mit so etwas wie gesetzt haben:
myPage.Children.Add(newCanvas);
newCanvas.SetValue(Canvas.LeftProperty, 10);
aber es macht keinen Unterschied - sobald der SetValue()
Anruf getroffen wird, geht der Browser weiß.
Die Klasse Canvas
scheint keine direkte Methode zur Einstellung von Left/Top auf sich zu haben, abgesehen von der SetValue()
-Funktion mit Abhängigkeitseigenschaften enum-Werten. Es gibt auch Canvas.SetLeft()
und Canvas.SetTop()
, aber ich denke, sie sind nur Shims auf SetValue()
. Sie zu benutzen, hat sowieso nicht geholfen.
Wenn ich nicht SetValue()
aufrufen, dann erscheint meine Leinwand (und Kind-Objekte, die ich hinzugefügt habe) in der SL-App, wie Sie vielleicht erwarten, ganz oben links.
Wenn ich erstellen und Position ein Canvas
Objekt in Expression Blend, dann ist die XAML generiert enthält Canvas.Left
und Canvas.Top
Eigenschaftswerte auf den Canvas
selbst, wie ich erwarten würde, so scheint es mir, dass das, was ich in C# versuchen sollte Arbeit.
Aber ich bin nicht in der Lage, die linken/oberen Werte selbst aus C# zu setzen, ohne dass der SL im Browser ganz komisch wird.
Irgendwelche Ideen?
Edit: mein Ansatz ist richtig, aber Leinwand Coords müssen Fließkomma, nicht ganzzahlig sein - siehe akzeptierte Antwort für Details.
+1 Guter Fang, gut entdeckt – AnthonyWJones