2008-11-04 6 views

Antwort

3

Gute Frage. Ich habe keine Möglichkeit gefunden, es direkt zu machen, bin aber ziemlich nah an das Silverlight Controls-Projekt geraten (in einigen Klassen wird der Scrollviewer für das Elementsteuerelement verwendet). Hier ist, wie Sie es bekommen können, aber es erfordert eine benutzerdefinierte listbox:

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); 
    } 
} 

Es könnte eine andere Art und Weise sein, in diesem Fall Haken (oder eine andere Art und Weise, dass die Platte zu bekommen), wenn Sie bei der Vorlage sucht die ListBox Sie sehen, dass der Scroll-Viewer eigentlich "ScrollViewer" heißt, die GetTemplateChild-Methode ist jedoch geschützt, sodass Sie immer noch eine benutzerdefinierte Klasse erstellen müssen.

5

Von innerhalb einer Klasse, die von der ListBox-Klasse erbt, können Sie die Protected GetTemplateChild() verwenden:

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

Wenn Sie diese von außerhalb des List-Box zugreifen möchten, dann die Scroll über eine Belichtungs Property sollte funktionieren, wiederum durch Vererbung.

CAVEAT: Wenn Sie Ihre eigene benutzerdefinierte Vorlage festgelegt haben, ist dieser Scrollviewer möglicherweise nicht vorhanden. Sie können den Namen des Scrollviewer-Templates anstelle des "ScrollViewer" in der obigen Methode verwenden.

+0

GetTemplateChild zeigt eine geschützte Methode. Ist das neu? Denn jetzt scheint es, dass deine Lösung nicht mehr funktioniert. http://msdn.microsoft.com/en-us/library/system.windows.controls.control.gettemplatechild(v=VS.95).aspx –

+0

Nicht sicher, aber ich denke, Sie müssen eine Eigenschaft auf einem erstellen Klasse erben. Das habe ich am Ende getan, wenn ich mich richtig erinnere; Es war sowieso eine benutzerdefinierte Listenansicht. – Dann

+0

Dies funktioniert tatsächlich nicht und sollte nicht versucht werden. GetTemplateChild ist eine geschützte Methode. – Kevin

-1
ScrollViewer scrollViewer = yourListBox.getScrollHost(); 

null ist, wenn kein datasourse in das Listenfeld gesetzt, in meinem Fall zurückkehren es richtig UI-Element nur nach unten Code

myListBox.ItemsSource = list; 
0

ausgeführt Sie können auch anrufen:

myListBox.ApplyTemplate(); 

zu zwingen den zu erstellenden ListBox-Baum, sonst gibt GetTemplateChild() Null zurück, wenn Sie versuchen, sofort darauf zuzugreifen.

Das funktioniert gut kombiniert mit "Erno de Weerd" Erklärung: erben ListBox, GetTemplateChild() -Methode aufrufen zu können.

Ich habe auch versucht:

  • ListBox-Extension-Methode "GetScrollHost()" zu verwenden, aber es hat nie funktioniert für mich (auch nach der vollständigen Seite Initialisierungen).
  • "FindName()", aber es hat nicht funktioniert, auch wenn ich den Namen ScrollViewer in der ListBox Vorlage angegeben.

Emmanuel (Silverlight 3)

1

Sagen wir es einfach machen ... In Ihrem Listbox Vorlage, können Sie die Scrollsteuerung finden. Fügen Sie eine Loaded-Methode hinzu, und Sie werden sich selbst von dem Sender arg erhalten.

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

das funktioniert für mich