WPF / C # TextWrapping em um scrollviewer faz o redimensionamento da janela laggy
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.
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;
}