Curso Windows Phone – Como obter acesso a controles dentro do ItemTemplate do ListBox

Olá pessoal, tudo bom?

Aproveito uma questão que me fizeram para escrever esse post que demonstra como obter acesso a controles que estão posicionados dentro do ItemTemplate de um determinado ListBox ou outro container qualquer.

Tomando por base a seguinte definição para um ListBox cuja finalidade seria exibir tipos de pizzas e seus respectivos ingredientes:

...
<StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
  <ListBox Name="lbSabores" Height="540" ItemsSource="{StaticResource MeusDados}">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <StackPanel>
          <CheckBox Height="Auto" Content="{Binding Nome}" IsChecked="{Binding Selecionado}" />
          <TextBlock Name="txtIngredientes" Height="Auto" Text="{Binding Ingredientes}" />
        </StackPanel>
      </DataTemplate>
    </ListBox.ItemTemplate>
  </ListBox>
</StackPanel>
...

Considerando ainda a existência de um botão que irá destacar todos os TextBlocks que exibem os ingredientes das pizzas (trocar a cor do texto Foreground)

...
<Button Name="btnDestacar" Content="Destacar Ingredientes" Tap="btnDestacar_Tap" />
...

Repare agora que utilizei um método genérico em C# que permite localizar controles dentro de um determinado container (no nosso caso o ListBox lbSabores), sendo que para o caso, faço uma pergunta buscando por um determinado TextBlock chamado txtIngredientes e, quando encontrado, troco a cor da fonte do mesmo.

...
private void Destacar(DependencyObject targetElement)
{
  var count = VisualTreeHelper.GetChildrenCount(targetElement);
  if (count == 0)
    return;
  for (int i = 0; i < count; i++)
  {
    var child = VisualTreeHelper.GetChild(targetElement, i);
    if (child is TextBlock)
    {
      TextBlock targetItem = (TextBlock)child;
      if (targetItem.Name == "txtIngredientes")
      {
        targetItem.Foreground = new SolidColorBrush(Colors.Green);
        return;
      }
    }
    else
    {
      Destacar(child);
    }
  }
}
...

Agora, imaginando que o usuário toque no botão “Destacar Ingredientes” podemos chamar o método Destacar e passar para ele o ListBox que contem os elementos que queremos localizar.

...
private void btnDestacar_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
  Destacar(lbSabores);
}
...

controles-localizar-wp

Espero ter ajudado!

Posts Relacionados: 

Grande abraço,
Eduardo Henrique Rizo

Referência: http://www.geekchamp.com/tips/how-to-access-a-control-placed-inside-listbox-itemtemplate-in-wp7

Anúncios

Coordenador de Internet da Universidade do Oeste Paulista (Unoeste) e professor universitário de disciplinas relacionadas ao desenvolvimento de sistemas para Web, gerenciamento de servidores, serviços e redes.

Marcado com: , , , , , , , , , , , , , , , , ,
Publicado em Windows Phone
22 comentários em “Curso Windows Phone – Como obter acesso a controles dentro do ItemTemplate do ListBox
  1. Olá Eduardo!
    Muito obrigado pelo post.

    Porém, não funcionou como esperado.
    Utilizei esse método para que ao entrar na página dependendo de uma condição, o foreground fique branco ou preto.

    Porém se eu sair da aplicação e entrar de novo, mesmo chamando o método ao carregar página (Loaded), o fundo fica da cor padrão.

    Mas, se eu vou pra outra página e volto pra ela, funciona normalmente.

    O que pode estar errado?
    Por que não carrega quando saio da app e volto?

    Abraços.

  2. Olá Eduardo Segue o cód:

    //1º Faço uma verificação para saber qual cor devo usar dentro do LayoutRoot_Update:

    ImageSource sourceBg = new BitmapImage(new Uri(imagem, UriKind.Relative));
    //imagem é o caminho da imagem de fundo
    if (imagem== “Imagens/05.jpg”)
    {
    cor_do_texto = new SolidColorBrush(Colors.White);
    Muda_Cor_Texto(cor_do_texto);
    }
    else
    {
    cor_do_texto = new SolidColorBrush(Colors.Black);
    Muda_Cor_Texto(cor_do_texto);
    }

    //Muda Cor Texto é pra mudar os foreground’s de todos os itens da página.
    private void Muda_Cor_Texto(SolidColorBrush cor)
    {
    SolidColorBrush foreground_cor = cor;
    //Mudar_Cor_ListBox é o método que você passou ali em cima como ‘Destacar’.
    Mudar_Cor_ListBox(Sit_ListBox, foreground_cor);
    ApplicationTitle.Foreground = foreground_cor;
    PageTitle.Foreground = foreground_cor;
    }

    Então o código que uso é esse.

  3. […] Como obter acesso a controles dentro do ItemTemplate do ListBox […]

  4. Arthur Rocha disse:

    Muito bom o post Eduardo, falando de ListBox, eu tenho um problema. Eu crio o Selection Changed do listbox, quando eu clico e vou pra a proxima pagina com o o objeto selecionado, blz isso tá certo, só quando eu volto para pagina onde está a listbox o item fica selecionando e não posso seleciona novamente. Para eu selecionar ele novamente tenho que clicar em outro item e depois volto e posso selecionar o antigo item selecionando, mas o que acabei de seleciona eu não consigo.

    • E você precisa voltar com esse último item selecionado?
      Se não, basta utilizar o método OnNavigatedTo na página onde está o ListBox e fazer com que ele volte à sua posição inicial. O método OnNavigatedTo ocorre quando a pessoa entra na página ou volta para ela.

      Certo?

    • Caro Arthur,
      Se entendi bem você quer que ao voltar para o listbox possa selecionar o mesmo item novamente é isso?

      Se for isso, tente resetar o selectIndex. assim óh:

      private void SeuListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
      {
      // If selected index is -1 (no selection) do nothing
      if (SeuListBox.SelectedIndex == -1)
      return;

      // açao que você quer.
      Acao();

      // Reset selected index to -1 (no selection)
      SeuListBox.SelectedIndex = -1;
      }

      Ou seja, quando ele executar a ação já não vai ter nenhum item selecionado.
      Se sua ação for de ir em outra página, quando você voltar não vai ter nenhum item selecionado.

      Abraços.

      • Arthur Rocha disse:

        Caro Gutenberg Carlos,

        Deu certo o seu exemplo, vlw mesmo.

        Caro Eduardo,
        vlw pelos link, vou da uma olhada sim.

        Abraço a todos.

  5. Igor Rozani disse:

    olá Eduardo, estou tentando fazer isto para acessar uma stackpanel e deixa-lá visível mas pelo que eu entendi as stackpanel não visíveis não são encontradas pelo VisualTreeHelper.GetChild, você teria alguma alternativa para isto?

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Erro: o Twitter não respondeu. Por favor, aguarde alguns minutos e atualize esta página.

Sorocaba e Região
Prestadora de serviços RIZZO GS - Sorocaba/SP

Serviços de limpeza, conservação, recepção, copa, portaria, vigia, zeladoria, jardim, elétrica, hidráulica, pintura, etc.

Contato: (15) 3357-4263 / (15) 3357-4502 - contato@rizzogs.com.br

Website: http://www.rizzogs.com.br

%d blogueiros gostam disto: