Pergunta

Hy.

Eu tenho um ListBox com um scrollviewer nele. Cada item (40 ++ itens) da caixa de listagem contém uma textblock e uma pequena imagem. Quando eu redimensionar a janela, o redimensionamento é muito vagaroso. Se eu colocar a visibilidade textblock dos itens de "colapso", o redimensionamento está bem. Minha primeira abordagem foi a de definir a visibilidade de cada item não é exibido na scrollviewer para "colapso", mas eu não poderia encontrar um indicador quando um artigo é visível para o usuário.

Alguém tem uma idéia para fazer o processo de redimensionamento menos lag, talvez algum outro controle em vez do textblock? Obrigado por você ajuda.

Foi útil?

Solução 2

A melhor maneira de melhorar o desempenho de redimensionamento é, para usar um VirtualizingStackPanel dentro de seu ScrollContentPresenter. Você pode substituir esse no modelo de dados de, por exemplo, a sua caixa de listagem, ou, em geral, você ItemsPanel.

Ele não processar itens, que não são visíveis, em comparação com um StackPanel normal, o que torna todos os itens o tempo todo, não importa se eles são visíveis para o usuário ou não.

funciona muito bem para mim.

Outras dicas

Os seguintes especifica se o item na dada posição é visível ou não:

public bool IsItemVisible(ListBox listBox, int index)
{
    if (listBox.Items.Count != 0)
    {
        VirtualizingStackPanel vsp = (VirtualizingStackPanel)VisualTreeHelper.GetParent(listBox.ItemContainerGenerator.ContainerFromIndex(0));
        int FirstVisibleItem = (int)vsp.VerticalOffset, VisibleItemCount = (int)vsp.ViewportHeight;
        return index >= FirstVisibleItem && index <= FirstVisibleItem + VisibleItemCount;
    }

    return false;
}

Você pode usá-lo como este:

private void Button_Click(object sender, RoutedEventArgs e)
{
    for (int i = listbox1.Items.Count - 1; i >= 0; i--)
        if (!IsItemVisible(listbox1, i))
            ((ListBoxItem)listbox1.Items[i]).Visibility = Visibility.Collapsed;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top