posts - 644, comments - 2003, trackbacks - 137

My Links

News

Raffaele Rialdi website

Su questo sito si trovano i miei articoli, esempi, snippet, tools, etc.

Archives

Post Categories

Image Galleries

Blogs

Links

WPF ListBoxItem è visibile? ... e la lista è in cima o in fondo?

Domande semplici a cui non corrispondono risposte altrettanto semplici.
Estrapolo da un mio custom control questi tre metodi che risolvono i quesiti.

Considerazioni:

  • Mi è piaciuto il VirtualizingStackPanel che rappresenta la viewport o "finestra" visibile della lista
  • Altrettanto bello che VerticalOffset e ViewportHeight siano double così da soddisfare anche liste con elementi non omogenei
  • Trovo folle che queste basilari informazioni non siano più facilmente accessibili direttamente dalle classi come la ListBox.

 

protected bool IsItemVisible(ListBox lb, int Index)
{
  if(lb.Items.Count == 0)
    return false;
  ListBoxItem lbi = lb.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem;
  VirtualizingStackPanel vsp = VisualTreeHelper.GetParent(lbi) as VirtualizingStackPanel;
  int FirstVisibleItem = (int)vsp.VerticalOffset;
  int VisibleItemCount = (int)vsp.ViewportHeight;
  if(Index >= FirstVisibleItem && Index <= FirstVisibleItem + VisibleItemCount)
    return true;
  return false;
}

protected bool IsListScrolledUp(ListBox lb)
{
  if(lb.Items.Count == 0)
    return false;
  ListBoxItem lbi = lb.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem;
  if(lbi == null)
  {
    Console.WriteLine("lbi is null :-(");
    return false;
  }
  VirtualizingStackPanel vsp = VisualTreeHelper.GetParent(lbi) as VirtualizingStackPanel;
  int FirstVisibleItem = (int)vsp.VerticalOffset;
  if(FirstVisibleItem > 0)
    return false;
  return true;
}

protected bool IsListScrolledDown(ListBox lb)
{
  if(lb.Items.Count == 0)
    return false;
  ListBoxItem lbi = lb.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem;
  if(lbi == null)
  {
    Console.WriteLine("lbi is null :-(");
    return false;
  }
  VirtualizingStackPanel vsp = VisualTreeHelper.GetParent(lbi) as VirtualizingStackPanel;
  int FirstVisibleItem = (int)vsp.VerticalOffset;
  int VisibleItemCount = (int)vsp.ViewportHeight;
  if(VisibleItemCount + FirstVisibleItem == lb.Items.Count)
    return true;
  return false;
}

Print | posted on Friday, August 18, 2006 3:40 PM |

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET