none
Acceder a objetos de StackPanel RRS feed

  • Pregunta

  • Buenas!

    Estoy comenzando a ver algo de WPF y me he encontrado con algunas dificultades.

    Lo que necesito es acceder a los objetos que se encuentran dentro del StackPanel. Por el momento lo puedo hacer a traves del evento Loaded, aunque no soluciona mi problema. Necesito accederlos en cualquier momento.

    Estoy utilizando la funcion FindVisualChildByName<T>(DependencyObject parent, string name).


    XAML

    <ListView HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Name="lvPrueba">
                <ListView.View>
                    <GridView x:Name="gvPrueba">
                        <GridViewColumn x:Name="gvcPrueba">
                            <GridViewColumn.HeaderContainerStyle>
                                <Style TargetType="{x:Type GridViewColumnHeader}">
                                    <Setter Property="HorizontalContentAlignment" Value="Left" />
                                </Style>
                            </GridViewColumn.HeaderContainerStyle>
                            <GridViewColumn.HeaderTemplate>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal" Loaded="StackPanel_Loaded">
                                        <!--A estos TextBlocks necesito acceder-->
                                        <TextBlock Name="txtb1" FontSize="18">1</TextBlock>
                                        <TextBlock Name="txtb2" FontSize="18">2</TextBlock>
                                        <TextBlock Name="txtb3" FontSize="18">3</TextBlock>
                                        <TextBlock Name="txtb4" FontSize="18">4</TextBlock>
                                        <TextBlock Name="txtb5" FontSize="18">5</TextBlock>
                                    </StackPanel>
                                </DataTemplate>
                            </GridViewColumn.HeaderTemplate>
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">
                                        
                                    </StackPanel>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>



    C#

    private void StackPanel_Loaded(object sender, RoutedEventArgs e)
    {
                StackPanel stackPanel;
                TextBlock txtb;
                
                stackPanel = (StackPanel)sender;
                txtb = (TextBlock)FindVisualChildByName<TextBlock>(stackPanel, "txtb1");
                txtb.Text = "prueba";
    }

    ¿Alguna idea?

    Gracias!



    Santiago Ezequiel Rueda
    santiagorueda@live.com.ar
    Blog





    viernes, 14 de febrero de 2014 12:44

Respuestas

  • Buenas!

    Ya pude resolver el problema interpretando un poco como funcionaba la función FindVisualChildByName.

    Lo que hice fue ponerle un nombre al StackPanel y lo accedí de la siguiente forma:

    XAML

    <StackPanel Orientation="Horizontal" Name="spPrueba">
        <TextBlock Name="txtb1" FontSize="18">1</TextBlock>
        <TextBlock Name="txtb2" FontSize="18">2</TextBlock>
        <TextBlock Name="txtb3" FontSize="18">3</TextBlock>
        <TextBlock Name="txtb4" FontSize="18">4</TextBlock>
        <TextBlock Name="txtb5" FontSize="18">5</TextBlock>
    </StackPanel>

    C#

    StackPanel sp = (StackPanel)FindVisualChildByName<StackPanel>(lvPrueba, "spPrueba");

    Les dejo la función FindVisualChildByname por si alguien la necesita:

            public static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
                {
                    var child = VisualTreeHelper.GetChild(parent, i);
                    string controlName = child.GetValue(Control.NameProperty) as string;
                    if (controlName == name)
                    {
                        return child as T;
                    }
                    else
                    {
                        T result = FindVisualChildByName<T>(child, name);
                        if (result != null)
                            return result;
                    }
                }
                return null;
            }

    Saludos!


    Santiago Ezequiel Rueda
    santiagorueda@live.com.ar
    Blog



    viernes, 14 de febrero de 2014 17:48