2008-11-04 9 views

Respuesta

3

Buena pregunta. No encontré una manera de hacerlo directamente, pero me acerqué bastante al mirar el proyecto de Silverlight Controls (usan el scrollviewer en el control de elementos en algunas de las clases). Aquí es cómo puede conseguirlo, pero requiere de un cuadro de lista personalizada:

public class TestBox : ListBox 
{ 
    private ScrollViewer _scrollHost; 

    protected override void PrepareContainerForItemOverride(DependencyObject element, object item) 
    { 
     var itemsHost = VisualTreeHelper.GetParent(element) as Panel; 

     for (DependencyObject obj = itemsHost; obj != item && obj != null; obj = VisualTreeHelper.GetParent(obj)) 
     { 
      ScrollViewer viewer = obj as ScrollViewer; 
      if (viewer != null) 
      { 
       _scrollHost = viewer; 
       break; 
      } 
     } 

     base.PrepareContainerForItemOverride(element, item); 
    } 
} 

Puede haber otra forma de gancho en ese evento (o otra manera de conseguir que el panel), Si nos fijamos en la plantilla para el ListBox verá que el visor de desplazamiento en realidad se llama "ScrollViewer", sin embargo, el método GetTemplateChild está protegido, por lo que aún tendría que crear una clase personalizada.

5

Desde dentro de una clase que hereda de la clase ListBox, puede utilizar la GetTemplateChild Protegida():

var myScrollviewer = myListBox.GetTemplateChild("ScrollViewer") as ScrollViewer;

Si desea acceder a este desde fuera del cuadro de lista, a continuación, exponer la ScrollViewer a través de una La propiedad debería funcionar, nuevamente a través de la herencia.

CAVEAT: Si ha configurado su propia plantilla personalizada, este Scrollviewer puede no existir. Puede utilizar el nombre de ScrollViewer de plantillas en lugar del "ScrollViewer" en el método anterior.

+0

GetTemplateChild muestra ser un método protegido. ¿Es eso nuevo? porque ahora parece que tu solución ya no funcionará. http://msdn.microsoft.com/en-us/library/system.windows.controls.control.gettemplatechild(v=VS.95).aspx –

+0

No estoy seguro, pero supongo que tendrá que crear una propiedad en un clase heredera Esto es lo que hice al final si recuerdo correctamente; era una lista personalizada de todos modos. – Dann

+0

Esto realmente no funciona y no debe intentarse. GetTemplateChild es un método protegido. – Kevin

-1
ScrollViewer scrollViewer = yourListBox.getScrollHost(); 

es nulo si no hay datasourse establece en el cuadro de lista, en mi caso volver correctamente la interfaz de usuario Elemento sólo después de que a continuación código ejecutado

myListBox.ItemsSource = list; 
0

Usted puede llamar a:

myListBox.ApplyTemplate(); 

para forzar el árbol visual de ListBox que se creará; de lo contrario, GetTemplateChild() devolverá nulo si intenta acceder a él inmediatamente.

Esto funciona bien combinado con la explicación "Erno de Weerd": hereda ListBox para poder llamar al método GetTemplateChild().

También probé:

  • de usar el método de extensión ListBox "GetScrollHost()", pero nunca trabajó para mí (incluso después de inicializaciones de página completa).
  • "FindName()", pero no funcionó, incluso cuando especifiqué el nombre ScrollViewer en la plantilla ListBox.

Emmanuel (Silverlight 3)

1

Vamos a hacer que sea fácil ... En la plantilla de cuadro de lista, es posible encontrar el control ScrollViewer. Agregue un método cargado para ello, y se obtendrá desde el remitente arg.

private void ScrollViewer_Loaded(object sender, System.Windows.RoutedEventArgs e) 
    { 
     myScrollViewer = (sender as ScrollViewer); 
    } 

esto funciona para mí

Cuestiones relacionadas