2011-06-13 151 views
11

我正在編寫我的自定義WPF ItemsControl以顯示項目列表。該項目顯示嵌入的ScrollViewer內:如何將WPF ScrollViewer的內容滾動到特定位置

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

我要確保,當我將鼠標移動到該控件,特定項目(標記爲選中)將滾動到鼠標的位置。在我的OnMouseEnter方法中,我能夠找到該項目,但我不知道下一步該怎麼做。有人有什麼主意嗎?

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

回答

13

類似下面的什麼位置:

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

使用UIElement.TranslatePoint()來計算要滾動到

使用ScrollViewer.ScrollToVerticalOffset()做滾動

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

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

更新:(感謝@jmbpiano)請注意,它不會將控件精確地帶到當前的鼠標光標位置。它只是把控制帶到一個可見的位置,操作員可以用鼠標點擊它(99%的案例都是發現這個問題的人都可能需要)。

+0

非常感謝!我用其他方式度過了一整天,但最後你的解決方案救了我..真的非常感謝這麼多! – 2016-05-27 09:42:39

+2

這實際上並沒有實現提問者的要求,因爲它完全忽略了鼠標的位置,但它至少將屏幕上的控件顯示在屏幕上(在99%的案例中,所有發現此問題的人都可能需要)。所以這當然是一個寶貴的貢獻。 – jmbpiano 2016-10-20 21:00:24

+0

這非常符合我的需求,謝謝! – 2017-07-16 11:24:38