2011-06-13 12 views
11

Öğe listesini görüntülemek için özel WPF ItemsControl yazıyorum. öğeleri ScrollViewer içine gömülü olarak gösterilmektedir:WPF ScrollViewer'ın içeriği belirli bir konuma nasıl kaydırılır

<Style TargetType="MyCustomItemsControl"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="MyCustomItemsControl"> 
        <ScrollViewer x:Name="PART_MyScrollViewer" > 
          <ItemsPresenter/> 
        </ScrollViewer> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
</Style> 

ben kontrol içine fareyi hareket ettirdiğinizde, (seçili olarak işaretlenmiş) belirli madde fare pozisyonuna kaydırılır emin olmak istiyorum. OnMouseEnter yöntemimde öğeyi bulabiliyorum ancak ne yapacağımı bilmiyorum. Herhangi bir fikri olan var mı?

protected override void OnMouseEnter(MouseEventArgs e) 
{ 
    for (int i = 0; i < Items.Count; i++) 
    { 
     ContentPresenter uiElement = (ContentPresenter)ItemContainerGenerator.ContainerFromIndex(i); 
     var item = uiElement.Content as MyCustomObject; 
     if (item.IsSelected) 
     { 
      // How to scroll the uiElement to the mouse position? 
      break; 
     } 
    } 
} 

cevap

13

şey yapmak

Kullanım ScrollViewer.ScrollToVerticalOffset() ilerleyin istediklerini pozisyon hesaplamak için:

var sv = (ScrollViewer)Template.FindName("PART_MyScrollViewer", this); // If you do not already have a reference to it somewhere. 
var ip = (ItemsPresenter)sv.Content; 
var point = item.TranslatePoint(new Point() - (Vector)e.GetPosition(sv), ip); 
sv.ScrollToVerticalOffset(point.Y + (item.ActualHeight/2)); 
7

Kullanım UIElement.TranslatePoint() aşağıdaki gibi kaydırma

12
// How to scroll the uiElement to the mouse position? 
uiElement.BringIntoView(); 

REF: https://msdn.microsoft.com/en-us/library/ms598110.aspx

UPDATE: (jmbpiano'ya teşekkürler) Not, denetimi tam olarak geçerli fare imleci konumuna getirmez. Sadece kontrolü, Operatörün fareyle tıklayabildiği (bu sorunun% 99'unda bulunması gereken kişinin sorulması gereken kişi) olduğu görünür bir konuma getirir.

+0

Çok teşekkür ederim! Bütün günümü başka yollarla geçirdim ama sonunda çözümün beni kurtardı .. Gerçekten çok çok minnettarım !!! –

+2

Bu, gerçekte istediği şeyi yapmaz, çünkü tamamen farenin konumunu görmezden gelir, ancak en azından kontrolün ekrana getirilmesini sağlar (bu sorunun% 99'unda bu soruyu duyan herkesin olması muhtemeldir.) gerekir. Yani kesinlikle değerli bir katkıdır. – jmbpiano

+0

Bu ihtiyaçlarımızı çok karşıladı, teşekkürler! –