none
Zugriff auf Children von StackPanel RRS feed

  • 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] ???
    
            }


    Montag, 30. Mai 2022 15:00

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 = . . .
        }
     }

    Dienstag, 31. Mai 2022 13:14
  • 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>
            /// 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)
            {

                f o r e a c h (UIElement aktUIElement in UISammlung)          // Durch die UI-Sammlung iterieren
    {

    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.


    Freitag, 10. Juni 2022 19:41

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.

    Dienstag, 31. Mai 2022 08:29
    Moderator
  • 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 = . . .
        }
     }

    Dienstag, 31. Mai 2022 13:14
  • Danke für den Hinweis, ich nehme nun aber die sehr einfache Lösung aus dem englischen Forum.
    Dienstag, 31. Mai 2022 13:16
  • 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>
            /// 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)
            {

                f o r e a c h (UIElement aktUIElement in UISammlung)          // Durch die UI-Sammlung iterieren
    {

    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.


    Freitag, 10. Juni 2022 19:41