如何将WPF ScrollViewer的内容滚动到特定位置

|| 我正在编写自定义WPF ItemsControl以显示项目列表。这些项目显示为嵌入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;
        }
    }
}
    
已邀请:
        类似于以下内容:
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));
    
        
// How to scroll the uiElement to the mouse position?
uiElement.BringIntoView();
参考:https://msdn.microsoft.com/zh-cn/library/ms598110.aspx 更新:(由于@jmbpiano)请注意,它不能将控件完全移到当前鼠标光标位置。它只是将控件移到可见位置,操作员可以在其中单击鼠标(在99%的情况下,发现这个问题的人可能都需要使用该控件)。     
        使用UIElement.TranslatePoint()计算要滚动到的位置 使用ScrollViewer.ScrollToVerticalOffset()进行滚动     
        试试下面的代码:
private void ScrollViewerFromVSTree(DependencyObject element, double pos)
{
    try
    {
        int totalElementcount = VisualTreeHelper.GetChildrenCount(element);
        for (int counter = 0; counter < totalElementcount; counter++)
        {
            DependencyObject ele = VisualTreeHelper.GetChild(element, counter);
            if (ele.GetType().Name == \"ScrollViewer\")
            {
                ScrollViewer scrollViewer = ele as ScrollViewer;
                if (pos > \"YourAssumption\") // for me it is 610
                {
                    scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + 45);
                }
                else if (pos < \"YourAssumption\") //for me it is 40
                {
                    scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - 45);
                }
                break;
            }
            ScrollViewerFromVSTree(VisualTreeHelper.GetChild(element, counter), pos);
        }
    }
    catch (Exception)
    {
    }
}

    

要回复问题请先登录注册