2011-06-13 9 views
11

Estoy escribiendo mi WPF ItemsControl personalizado para mostrar una lista de elementos. Los artículos se muestran incrustados dentro de un ScrollViewer:Cómo desplazar el contenido de WPF ScrollViewer a una ubicación específica

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

quiero para asegurarse de que cuando muevo el ratón en el control, un elemento determinado (marcada como seleccionada) se desplazará a la posición del ratón. En mi método OnMouseEnter, puedo encontrar el artículo pero no sé qué hacer a continuación. ¿Alguien tiene alguna idea?

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

Respuesta

13

algo como lo siguiente:

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

Uso UIElement.TranslatePoint() para calcular cuál es la posición que desea desplazarse a

Uso ScrollViewer.ScrollToVerticalOffset() para hacer el desplazamiento

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

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

ACTUALIZACIÓN: (gracias a @jmbpiano) Tenga en cuenta que no lleva el control exactamente a la posición actual del cursor del mouse. Simplemente lleva el control a una posición visible, donde el Operador podrá hacer clic con el mouse (que en el 99% de los casos es todo lo que alguien necesita para encontrar esta pregunta).

+0

¡Muchas gracias! Pasé un día entero con otras formas, pero finalmente tu solución me salvó ... realmente realmente aprecio mucho !!! –

+2

Esto no hace realmente lo que solicitó el solicitante, ya que ignora completamente la posición del mouse, pero al menos pone el control a la vista en la pantalla (que en el 99% de los casos es toda persona que encuentra que esta pregunta es probable que necesitar). Entonces, ciertamente es una contribución valiosa. – jmbpiano

+0

Esto encajaba mucho en mis necesidades, ¡gracias! –

Cuestiones relacionadas