在ItemsControl中反转ScrollViewer的滚动方向

时间:2016-05-17 12:05:26

标签: .net wpf scroll

无论出于何种原因,我有ItemsControl在Y坐标中翻转,其中我有一个ScrollViewer

<ItemsControl ...>

    ...

    <ItemsControl.LayoutTransform>
        <ScaleTransform ScaleY="-1" />
    </ItemsControl.LayoutTransform>

    <ItemsControl.Template>
        <ControlTemplate>
            <ScrollViewer Focusable="False" Padding="{TemplateBinding Control.Padding}">
                <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
            </ScrollViewer>
        </ControlTemplate>
    </ItemsControl.Template>

    ...

</ItemsControl>

每个DataTemplate都有类似的转换,因此文本看起来正确。

这产生的一个问题是滚动被颠倒了。无论如何反转滚动方向?或者以某种方式自己进行计算,而不是默认的滚动行为。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

如果将ItemsControl的LayoutTransform移动到ItemsPresenter怎么办?然后滚动查看器在翻转之外。

<ItemsControl ...>
    ...
    <ItemsControl.Template>
        <ControlTemplate>
            <ScrollViewer Focusable="False" Padding="{TemplateBinding Control.Padding}">
                <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}">
                    <ItemsPresenter.LayoutTransform>
                        <ScaleTransform ScaleY="-1" />
                    </ItemsPresenter.LayoutTransform>
                </ItemsPresenter>
            </ScrollViewer>
        </ControlTemplate>
    </ItemsControl.Template>
    ...
</ItemsControl>

好的......所以这对你不起作用。

如何制作自己的滚动查看器并覆盖OnPreviewMouseWheel以反转鼠标滚轮的增量变化?

public class ScrollViewerInvert : System.Windows.Controls.ScrollViewer
{
    protected override void OnPreviewMouseWheel(MouseWheelEventArgs e)
    {
        if (e.Delta != 0)
            e = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta * -1);
        base.OnPreviewMouseWheel(e);
    }
}