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

Met*_*tro 18 wpf mouse position 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>
Run Code Online (Sandbox Code Playgroud)

我想确保当我将鼠标移动到控件中时,特定项目(标记为已选中)将滚动到鼠标位置.在我的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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

epo*_*pox 22

// How to scroll the uiElement to the mouse position?
uiElement.BringIntoView();
Run Code Online (Sandbox Code Playgroud)

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

更新:(感谢@jmbpiano)注意,它不会将控件精确地带到当前鼠标光标位置.它只是将控件带到一个可见的位置,操作员可以用鼠标点击它(在99%的情况下,所有人都可能需要找到这个问题).

  • 这实际上并没有像提问者所要求的那样,因为它完全忽略了鼠标的位置,但它确实至少使控件在屏幕上显示(在99%的情况下,所有发现此问题的人都可能需要).所以这肯定是一个有价值的贡献. (4认同)

H.B*_*.B. 21

类似于以下内容:

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));
Run Code Online (Sandbox Code Playgroud)


Rob*_*evy 8

使用UIElement.TranslatePoint()计算要滚动到的位置

使用ScrollViewer.ScrollToVerticalOffset()进行滚动