2011-08-23 9 views
6

ScrollViewer'ımdan Scrollbar'a erişmek istiyorum.WPF: Scrollbar'dan ScrollViewer'dan nasıl programlanır?

Bence ScrollViewer'ın şablonunda bir yerde saklanıyor, erişebilmemin bir yolu var mı ve program aracılığıyla bir başvuru alınıyor mu?

Ben kodunda

<ScrollViewer x:Name="myScrollViewer"> 

var Yani eğer gitmek istiyorum arkasında:

ScrollBar scrollBar = myScrollViewer.GetScrollBar(); 

(besbelli, ben sadece bu daha yanıltıcıdır olurdu varsayıyorum)

cevap

13
Anladım düşünüyorum

....

myScrollViewer.ApplyTemplate(); 

ScrollBar s = myScrollViewer.Template.FindName("PART_VerticalScrollBar", myScrollViewer) as ScrollBar; 
+0

Şablon özelliği tipidir 'o Bulabileceğiniz çocukları içermiyor ControlTemplate'. – AnthonyWJones

+0

Evet öyle. Bu çalışır, WPF'de test edildi. Kaydırma çubuklarını bulmak için –

+0

'ApplyTemplate()' 'ScrollViewer' üzerinde çağrılmalıdır. ScrollViewer içeren bir denetimin public override void OnApplyTemplate() işlevinde bu yanıttaki kodu çağırırsanız, önce "myScrollViewer.ApplyTemplate()" sözcüğünü çağırmadan herhangi bir sonuç vermez. Kaydırma çubuklarını bulmak için – zmechanic

3

ScrollViewer görsel ağacında ScrollBar bulmak için VisualTreeHelper.GetChild yöntemini kullanmanız gerekir.

Bu yöntem çok düşük düzeyde işlevsellik sağladığından ve yüksek düzeyde kodda kullanmanız acı verici olacağından, muhtemelen LINQ to visual tree gibi bir sarıcı kullanmak isteyeceksiniz.

1

bu blog article den VisualTreeEnumerator kodu alın. yerine bu uzatma sınıfıyla

: -

ScrollBar s = myScrollViewer.Decendents() 
       .OfType<ScrollBar>() 
       .FirstOrDefault(sb => sb.Name == "PART_VerticalScrollBar"); 
+0

'ApplyTemplate()' 'ScrollViewer' üzerinde çağrılmalıdır. ScrollViewer içeren bir denetimin public override void OnApplyTemplate() işlevinde bu yanıttaki kodu çağırırsanız, önce "myScrollViewer.ApplyTemplate()" sözcüğünü çağırmadan herhangi bir sonuç vermez. – zmechanic