Benutzer mit den meisten Antworten
Zugriff auf Children von StackPanel

Frage
-
Finde leider keine Möglichkeit direkt auf die 'Children's eines StackPanels zuzugreifen (ohne eine parallele Liste zu erstellen).
z.B. hier als Demo die Hintergrundfarbe eines Borders zu ändern.
Border border; private void Button0_Click(object sender, RoutedEventArgs e) { border = new Border(); border.Background = new SolidColorBrush(Colors.Red); _stack0.Children.Add(border); border.Width = 100; border.Height = 100; border = new Border(); border.Background = new SolidColorBrush(Colors.Yellow); _stack0.Children.Add(border); border.Width = 75; border.Height = 75; border = new Border(); border.Background = new SolidColorBrush(Colors.Green); _stack0.Children.Add(border); border.Width = 50; border.Height = 50; } private void Button1_Click(object sender, RoutedEventArgs e) { _stack0.Children[0].Opacity = 0.5; //Change Background of Children[0] ??? }
Antworten
-
Ich habe die Frage noch einmal im englischen Forum gestellt und eine sehr einfache 'Superlösung' erhalten.
Frage+Antwort im englischen Forum
Und hier gleich noch der Code:
private void Button1_Click(object sender, RoutedEventArgs e) { Border b = _stack0.Children[0] as Border; if( b != null) { b.Background = . . . } }
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Moderator Freitag, 3. Juni 2022 12:54
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Freitag, 24. Juni 2022 13:32
-
Hallo hth26!
Vornamen machen es etwas persönlicher. ;-)
Deine Lösung ist etwas unflexibel, da du genau wissen musst, in welcher Reihenfolge etwas der UICollection hinzugefügt wird. Wenn sich aus irgend einem Grund die Reihenfolge ändert, musst du jedes Mal nachvollziehen, welchen Index nun dein Such-Element hat.
Ich habe mal eine Methode geschrieben, die per Reflektion in einer UICollection ein UIElement nach dem Eigenschaftswert einer frei definierbaren Eigenschaft sucht.
Die Tag-Eigenschaft ist prädestiniert die Such-Eigenschaft darzustellen, da sie in vielen UIElementen implementiert und vom Typ Object ist. Du kannst also Zahlen oder Strings oder ... als Identifikationsmerkmal verwenden.
Hier erst einmal die Methode:
(foreach zusammenschreiben, konnte so aber nicht gespeichert werden.)
/// <summary>
f o r e a c h (UIElement aktUIElement in UISammlung) // Durch die UI-Sammlung iterieren
/// Sucht nach einem UI-Element in der übergebenen UI-Sammlung, anhand des Types, der Eigenschaft und des Eigenschaftswertes.
/// </summary>
/// <param name="UISammlung">Sammlung der UI-Elemente, die durchsucht werden soll.</param>
/// <param name="SuchType">Typ des UIElements, dass in der UI-Sammlung gefunden werden soll. (Such-Typ)</param>
/// <param name="SuchEigenschaft">Welche Eigenschaft (Name) soll zum Suchen verwendet werden? (Such-Eigenschaft)</param>
/// <param name="SuchWert">Welchen Wert soll die Such-Eigenschaft haben? (Such-Wert)</param>
/// <returns>UI-Element, dass bei der Such-Eigenschaft, den übergebenen Such-Wert hat, oder Null.</returns>
private UIElement GetUIElement(UIElementCollection UISammlung, Type SuchType, string SuchEigenschaft, object SuchWert)
{
{if (aktUIElement.GetType() == SuchType) // Ist das aktuelle UI-Element ist vom Such-Typ? { System.Reflection.PropertyInfo suchEigenschaft = SuchType.GetProperty(SuchEigenschaft); // Such-Eigenschaft per Reflektion "holen" if(suchEigenschaft != null) // Ist die Such-Eigenschaft im akt UI-Element vorhanden? { object suchWert = suchEigenschaft.GetValue(aktUIElement); // Such-Wert "holen" if (SuchWert.Equals(suchWert)) return aktUIElement; // Wenn der Wert der Such-Eigenschaft des akt. UI-Elements dem Wert der Such-Eigenschaft entspricht, akt. UI-Element zurück geben. } } } return null; }
und als Anwendungsbeispiel einen Aufruf:
Ellipse Zentrum = (Ellipse)GetUIElement(UhrCanvas.Children, typeof(Ellipse), "Tag", "KreisZentrum"); if(Zentrum != null) Zentrum.Fill = FarbeZentrum;
In diesem Beispiel wird ein Ellipsen-Object dem in der Tag-Eigenschaft der Wert KreisZentrum zugeordnet wurde in einer Canvas-Children-Collection gesucht.
(Jede Änderung an den Eigenschaften des gefundenen UIElements wirken sich natürlich direkt auf das referenzierte Objekt in der Collection aus.)
Die Tag-Eigenschaft habe ich bei der Erstellung des Ellipsen-Objectes angegeben:Ellipse KreisZentrum = new Ellipse // Kreis Zentrum initalisieren { Fill = FarbeZentrum, Width = UhrWerte.NutzbareGrößeCanvas.Width * GrößeZentrum / 100, Height = UhrWerte.NutzbareGrößeCanvas.Height * GrößeZentrum / 100, Tag = "KreisZentrum" // Identifikations-ID }; Canvas.SetLeft(KreisZentrum, UhrWerte.UhrZentrumPoint.X - (KreisZentrum.Width / 2)); Canvas.SetTop(KreisZentrum, UhrWerte.UhrZentrumPoint.Y - (KreisZentrum.Height /2)); _ = UhrCanvas.Children.Add(KreisZentrum);
Die Methode kannst du unverändert in dein Projekt übernehmen. Musst eben nur den UI-Objekten die du wiederfinden möchtest, eine eindeutige ID zuweisen.
Frohes Schaffen!
Fred.- Bearbeitet perlfred Freitag, 10. Juni 2022 21:29
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Moderator Mittwoch, 15. Juni 2022 13:57
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Freitag, 24. Juni 2022 13:32
Alle Antworten
-
Hallo hth26,
In folgendem Thread findest Du drei Vorgehensweisen, um den Inhalt des Inneren eines StackPanels zu ändern. Dort wird zwar ein Label ausgeblendet, aber hoffentlich wird auch die Hintergrundfarbe des untergeordeneten Elementes beeinflusst werden können. Zum einen kann ein Converter eingesetzt werden, zum anderen eine abgeleitete Klasse. In letzterem Fall wird jedoch empfohlen, in der abgeleiteten Klasse die InternalChildren- statt der Children-Eigenschaft zu verwenden. Schließlich wird im Thread ein Beispielcode für Blend-Verhalten und angefügte Objekten angeführt.
Change children of StackPanel when StackPanel parent is resizing
Gruß,
Dimitar
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
- Bearbeitet Dimitar DenkovMicrosoft contingent staff, Moderator Dienstag, 31. Mai 2022 10:37 Tippfehler behoben
-
Ich habe die Frage noch einmal im englischen Forum gestellt und eine sehr einfache 'Superlösung' erhalten.
Frage+Antwort im englischen Forum
Und hier gleich noch der Code:
private void Button1_Click(object sender, RoutedEventArgs e) { Border b = _stack0.Children[0] as Border; if( b != null) { b.Background = . . . } }
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Moderator Freitag, 3. Juni 2022 12:54
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Freitag, 24. Juni 2022 13:32
-
Hallo hth26!
Vornamen machen es etwas persönlicher. ;-)
Deine Lösung ist etwas unflexibel, da du genau wissen musst, in welcher Reihenfolge etwas der UICollection hinzugefügt wird. Wenn sich aus irgend einem Grund die Reihenfolge ändert, musst du jedes Mal nachvollziehen, welchen Index nun dein Such-Element hat.
Ich habe mal eine Methode geschrieben, die per Reflektion in einer UICollection ein UIElement nach dem Eigenschaftswert einer frei definierbaren Eigenschaft sucht.
Die Tag-Eigenschaft ist prädestiniert die Such-Eigenschaft darzustellen, da sie in vielen UIElementen implementiert und vom Typ Object ist. Du kannst also Zahlen oder Strings oder ... als Identifikationsmerkmal verwenden.
Hier erst einmal die Methode:
(foreach zusammenschreiben, konnte so aber nicht gespeichert werden.)
/// <summary>
f o r e a c h (UIElement aktUIElement in UISammlung) // Durch die UI-Sammlung iterieren
/// Sucht nach einem UI-Element in der übergebenen UI-Sammlung, anhand des Types, der Eigenschaft und des Eigenschaftswertes.
/// </summary>
/// <param name="UISammlung">Sammlung der UI-Elemente, die durchsucht werden soll.</param>
/// <param name="SuchType">Typ des UIElements, dass in der UI-Sammlung gefunden werden soll. (Such-Typ)</param>
/// <param name="SuchEigenschaft">Welche Eigenschaft (Name) soll zum Suchen verwendet werden? (Such-Eigenschaft)</param>
/// <param name="SuchWert">Welchen Wert soll die Such-Eigenschaft haben? (Such-Wert)</param>
/// <returns>UI-Element, dass bei der Such-Eigenschaft, den übergebenen Such-Wert hat, oder Null.</returns>
private UIElement GetUIElement(UIElementCollection UISammlung, Type SuchType, string SuchEigenschaft, object SuchWert)
{
{if (aktUIElement.GetType() == SuchType) // Ist das aktuelle UI-Element ist vom Such-Typ? { System.Reflection.PropertyInfo suchEigenschaft = SuchType.GetProperty(SuchEigenschaft); // Such-Eigenschaft per Reflektion "holen" if(suchEigenschaft != null) // Ist die Such-Eigenschaft im akt UI-Element vorhanden? { object suchWert = suchEigenschaft.GetValue(aktUIElement); // Such-Wert "holen" if (SuchWert.Equals(suchWert)) return aktUIElement; // Wenn der Wert der Such-Eigenschaft des akt. UI-Elements dem Wert der Such-Eigenschaft entspricht, akt. UI-Element zurück geben. } } } return null; }
und als Anwendungsbeispiel einen Aufruf:
Ellipse Zentrum = (Ellipse)GetUIElement(UhrCanvas.Children, typeof(Ellipse), "Tag", "KreisZentrum"); if(Zentrum != null) Zentrum.Fill = FarbeZentrum;
In diesem Beispiel wird ein Ellipsen-Object dem in der Tag-Eigenschaft der Wert KreisZentrum zugeordnet wurde in einer Canvas-Children-Collection gesucht.
(Jede Änderung an den Eigenschaften des gefundenen UIElements wirken sich natürlich direkt auf das referenzierte Objekt in der Collection aus.)
Die Tag-Eigenschaft habe ich bei der Erstellung des Ellipsen-Objectes angegeben:Ellipse KreisZentrum = new Ellipse // Kreis Zentrum initalisieren { Fill = FarbeZentrum, Width = UhrWerte.NutzbareGrößeCanvas.Width * GrößeZentrum / 100, Height = UhrWerte.NutzbareGrößeCanvas.Height * GrößeZentrum / 100, Tag = "KreisZentrum" // Identifikations-ID }; Canvas.SetLeft(KreisZentrum, UhrWerte.UhrZentrumPoint.X - (KreisZentrum.Width / 2)); Canvas.SetTop(KreisZentrum, UhrWerte.UhrZentrumPoint.Y - (KreisZentrum.Height /2)); _ = UhrCanvas.Children.Add(KreisZentrum);
Die Methode kannst du unverändert in dein Projekt übernehmen. Musst eben nur den UI-Objekten die du wiederfinden möchtest, eine eindeutige ID zuweisen.
Frohes Schaffen!
Fred.- Bearbeitet perlfred Freitag, 10. Juni 2022 21:29
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Moderator Mittwoch, 15. Juni 2022 13:57
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Freitag, 24. Juni 2022 13:32