Benutzer mit den meisten Antworten
UserControls mit XML erstellen

Frage
-
Ich möchte dynamisch UserControls(zB buttons) erstellen.
Anzahl, Name, Content und Position sollen aus einer XML gelesen werden.
Anschließend möchte ich zB noch auf die Eigenschaften der einzelnen Buttons zugreifen.
Wie kann ich dann aber im Code schon auf die Buttons zugreifen, wenn diese erst zur Laufzeit erstellt werden?!?
Danke für Hilfe, ich hoffe, ich habe mich verständlich ausgedrückt.
Freitag, 23. Juli 2010 11:54
Antworten
-
Hi,
Ich möchte dynamisch UserControls(zB buttons) erstellen.
Anzahl, Name, Content und Position sollen aus einer XML gelesen werden.
Anschließend möchte ich zB noch auf die Eigenschaften der einzelnen Buttons zugreifen.
Wie kann ich dann aber im Code schon auf die Buttons zugreifen, wenn diese erst zur Laufzeit erstellt werden?!?
Du kannst nicht auf etwas zugreifen, was es nicht gibt. Ergo: Zuerst die Buttons erzeugen, danach dann darauf zugreifen.
Wo genau liegt denn das Problem? Wann willst Du wie auf die Buttons zugreifen und was soll dein Code mit den Buttons machen?
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Robert Breitenhofer Donnerstag, 23. September 2010 15:37
Freitag, 23. Juli 2010 13:40 -
Hallo le,
Du schiebst: > Anzahl, Name, Content und Position sollen aus einer XML gelesen werden.
ja, der Typ wäre sicher noch wichtig, aber ich hatte das auch schon mal in Windows Forms gemacht:
[Dynamisches Erzeugen von Controls per Reflection und XML]
http://dzaebel.net/DynamicCreate.htmSo ähnlich ist es dann auch in Silverlight, obwohl Du prüfen solltest, ob nicht auch XAML in Frage kommt - aber ok, das nur nebenbei.
Bleiben wir bei XML. Es gibt nun aber vielfältige Möglichkeiten der Implementierung.
Also - nehmen wir mal, Du benutzt letztlich Konstruktionen wie:private void btnTest_Click(object sender, RoutedEventArgs e) { var control1 = new SilverlightControl1 { Name = "control1" }; var control2 = new Border { Name="control2", Width = 130, Height = 100, CornerRadius=new CornerRadius(10.0), BorderBrush = new SolidColorBrush(Colors.Blue), BorderThickness = new Thickness(10.0)}; stackPanel1.Children.Add(control1); stackPanel1.Children.Add(control2); }
... dann kannst Du ja auf die Controls in diesem Fall mittels control1 und control2 zugreifen.
wenn Du aber generischere Konstruktionen wie in meinem Artikel (oben) benutzt, müsste man wissen, in was für einem Container-Control sie liegen, bzw. haben sie eine bestimmte Eigenschaft, um sie zu erkennen. Da Du Button sagtest - es ist ja möglich, durch alle Controls zu iterieren und nur die Controls mit dem Typ Button in eine Liste zu packen. Am einfachsten ist es sicher - wenn Du die später eben noch brauchst - sie beim Hinzufügen schon in in eine eigene Liste zu speichern. Nachher brauchst Du sie dann nur noch (ggf. unter Zuhilfenahme von Reflection) durchzugehen und ggf. die Eigenschaften anzusprechen.Oder dann zum Beispiel über den Namen die Instanz holen (es gäbe aber eben vielfältige andere Herangehensweisen) :
private void button1_Click(object sender, RoutedEventArgs e) { FrameworkElement c2 = FindName("control2") as FrameworkElement; MessageBox.Show(c2.Name + " gefunden!"); Border b = c2 as Border; b.BorderBrush = new SolidColorBrush(Colors.Green); MessageBox.Show("Border wird gleich grün ..."); }
ciao Frank- Als Antwort markiert Robert Breitenhofer Donnerstag, 23. September 2010 15:36
Samstag, 24. Juli 2010 07:42 -
Hallo le.,
Du hast ja nicht Bezug genommen auf meine Vorschläge, aber diese zu lesen und auf Aspekte davon zu antworten, ist ggf. von Vorteil.
- Du schriebst:
Ich habe mir eigene Buttons erstellt. In der XAML sieht das wie folgt aus.
<Button x:Name="Btn_Sensor7" Content="7" Height="15" Margin="506,295,79,90" Style="{StaticResource ButtonSensor}" Width="15" />
also hast Du diese Controls dort schon erstellt?
Nun willst Du sie nur noch (vielleicht anhand des Namens) finden und dann deren Eigenschaften wie etwa X-Y-Position setzen?Wenn ja, dann so, wie ich es in meinem ersten Posting gepostet habe (z.B. FindName).
Für direkt positionierende Controls ist in Silverlight das Canvas Layout-Control [MSDN] vorteilhaft.
Beachte auch, dass Du die Position durch [Margin, Style, Width, Height, ...] ja schon festgelegt hast, bzw. mit Deinen neuen XML-Positionen ggf. in Konflikt kommt. Diese Eigenschaften müsste man dann entsprechend der gewünschten XML-Position (oder dem gewünschten Layout-Panel) ggf. entsprechend zurücksetzen (oder anpassen).
ciao Frank- Als Antwort markiert Robert Breitenhofer Donnerstag, 23. September 2010 15:36
Samstag, 24. Juli 2010 17:00 - Du schriebst:
Alle Antworten
-
Hi,
Ich möchte dynamisch UserControls(zB buttons) erstellen.
Anzahl, Name, Content und Position sollen aus einer XML gelesen werden.
Anschließend möchte ich zB noch auf die Eigenschaften der einzelnen Buttons zugreifen.
Wie kann ich dann aber im Code schon auf die Buttons zugreifen, wenn diese erst zur Laufzeit erstellt werden?!?
Du kannst nicht auf etwas zugreifen, was es nicht gibt. Ergo: Zuerst die Buttons erzeugen, danach dann darauf zugreifen.
Wo genau liegt denn das Problem? Wann willst Du wie auf die Buttons zugreifen und was soll dein Code mit den Buttons machen?
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Robert Breitenhofer Donnerstag, 23. September 2010 15:37
Freitag, 23. Juli 2010 13:40 -
Hallo le,
Du schiebst: > Anzahl, Name, Content und Position sollen aus einer XML gelesen werden.
ja, der Typ wäre sicher noch wichtig, aber ich hatte das auch schon mal in Windows Forms gemacht:
[Dynamisches Erzeugen von Controls per Reflection und XML]
http://dzaebel.net/DynamicCreate.htmSo ähnlich ist es dann auch in Silverlight, obwohl Du prüfen solltest, ob nicht auch XAML in Frage kommt - aber ok, das nur nebenbei.
Bleiben wir bei XML. Es gibt nun aber vielfältige Möglichkeiten der Implementierung.
Also - nehmen wir mal, Du benutzt letztlich Konstruktionen wie:private void btnTest_Click(object sender, RoutedEventArgs e) { var control1 = new SilverlightControl1 { Name = "control1" }; var control2 = new Border { Name="control2", Width = 130, Height = 100, CornerRadius=new CornerRadius(10.0), BorderBrush = new SolidColorBrush(Colors.Blue), BorderThickness = new Thickness(10.0)}; stackPanel1.Children.Add(control1); stackPanel1.Children.Add(control2); }
... dann kannst Du ja auf die Controls in diesem Fall mittels control1 und control2 zugreifen.
wenn Du aber generischere Konstruktionen wie in meinem Artikel (oben) benutzt, müsste man wissen, in was für einem Container-Control sie liegen, bzw. haben sie eine bestimmte Eigenschaft, um sie zu erkennen. Da Du Button sagtest - es ist ja möglich, durch alle Controls zu iterieren und nur die Controls mit dem Typ Button in eine Liste zu packen. Am einfachsten ist es sicher - wenn Du die später eben noch brauchst - sie beim Hinzufügen schon in in eine eigene Liste zu speichern. Nachher brauchst Du sie dann nur noch (ggf. unter Zuhilfenahme von Reflection) durchzugehen und ggf. die Eigenschaften anzusprechen.Oder dann zum Beispiel über den Namen die Instanz holen (es gäbe aber eben vielfältige andere Herangehensweisen) :
private void button1_Click(object sender, RoutedEventArgs e) { FrameworkElement c2 = FindName("control2") as FrameworkElement; MessageBox.Show(c2.Name + " gefunden!"); Border b = c2 as Border; b.BorderBrush = new SolidColorBrush(Colors.Green); MessageBox.Show("Border wird gleich grün ..."); }
ciao Frank- Als Antwort markiert Robert Breitenhofer Donnerstag, 23. September 2010 15:36
Samstag, 24. Juli 2010 07:42 -
Danke für eure Antworten.
Um mein Problem noch einmal genauer zu erklären.
Ich habe mir eigene Buttons erstellt. In der XAML sieht das wie folgt aus.
<Button x:Name="Btn_Sensor7" Content="7" Height="15" Margin="506,295,79,90" Style="{StaticResource ButtonSensor}" Width="15" />
Anzahl, Namen und Position der Buttons möchte ich jetzt in einer XML festlegen.
<?xml version="1.0" encoding="utf-8" ?>
<sensorTree>
<sensor name="sensor_1" position_x="50" position_y="50"></sensor>
<sensor name="sensor_2" position_x="55" position_y="55"></sensor>
<sensor name="sensor_3" position_x="60" position_y="60"></sensor>
<sensor name="sensor_4" position_x="70" position_y="70"></sensor>
<sensor name="sensor_5" position_x="80" position_y="80"></sensor>
<sensor name="sensor_6" position_x="90" position_y="90"></sensor>
<sensor name="sensor_7" position_x="100" position_y="100"></sensor>
<sensor name="sensor_8" position_x="110" position_y="250"></sensor>
<sensor name="sensor_9" position_x="120" position_y="530"></sensor>
<sensor name="sensor_10" position_x="130" position_y="450"></sensor>
</sensorTree>
Sollte so in etwa aussehen.
Danke für eure Hilfen!
Samstag, 24. Juli 2010 15:59 -
Hallo le.,
Du hast ja nicht Bezug genommen auf meine Vorschläge, aber diese zu lesen und auf Aspekte davon zu antworten, ist ggf. von Vorteil.
- Du schriebst:
Ich habe mir eigene Buttons erstellt. In der XAML sieht das wie folgt aus.
<Button x:Name="Btn_Sensor7" Content="7" Height="15" Margin="506,295,79,90" Style="{StaticResource ButtonSensor}" Width="15" />
also hast Du diese Controls dort schon erstellt?
Nun willst Du sie nur noch (vielleicht anhand des Namens) finden und dann deren Eigenschaften wie etwa X-Y-Position setzen?Wenn ja, dann so, wie ich es in meinem ersten Posting gepostet habe (z.B. FindName).
Für direkt positionierende Controls ist in Silverlight das Canvas Layout-Control [MSDN] vorteilhaft.
Beachte auch, dass Du die Position durch [Margin, Style, Width, Height, ...] ja schon festgelegt hast, bzw. mit Deinen neuen XML-Positionen ggf. in Konflikt kommt. Diese Eigenschaften müsste man dann entsprechend der gewünschten XML-Position (oder dem gewünschten Layout-Panel) ggf. entsprechend zurücksetzen (oder anpassen).
ciao Frank- Als Antwort markiert Robert Breitenhofer Donnerstag, 23. September 2010 15:36
Samstag, 24. Juli 2010 17:00 - Du schriebst: