3

我一直在寻找解决方案,但无法找到正确的解决方案。我有宽度为 960 的网格并ScrollViewer在其中。现在我想知道滚动时滚动的值(水平偏移)。我找到的所有解决方案都适用于 wpf/silverlight,它对我不起作用。

编辑

好的,这是示例代码,xaml:

<ScrollViewer Name="Scroll" LayoutUpdated="ScrollViewer_LayoutUpdated" IsEnabled="True" Width="480" ScrollViewer.HorizontalScrollBarVisibility="Auto">
    <Grid x:Name="ContentPanel" Background="Red" Margin="12,0,12,0" Width="960">
        <Rectangle Name="GreenRectangle" Fill="Green" Width="240" Height="240"></Rectangle>
    </Grid>
</ScrollViewer>

C#

private void ScrollViewer_LayoutUpdated(object sender, EventArgs e)
{
    GreenRectangle.Width = Scroll.HorizontalOffset;
    GreenRectangle.Height = Scroll.HorizontalOffset;
}

但问题是它并不是一直在改变大小。也许我的英语不好,你听不懂我。这是电影示例,我向左向右滑动,大小始终相同。当我停止滑动时,它正在改变大小。

https://www.dropbox.com/s/eh28oavxpsy19bw/20130122_1601_56.avi

4

3 回答 3

4

可以通过使用 scrollviewers 依赖属性,它有一个 Horizo​​ntalOffset 和一个 VerticalOffset。诀窍是将事件绑定到滚动查看器,但可以在加载事件处理程序中完成。如果您在滚动查看器中放置一个宽网格,您可以获得偏移量!

在您的 xaml 文件中(此处为 MainPage 示例):

        <ScrollViewer Loaded="ScrollViewer_Loaded_1">
        <Grid x:Name="ContentPanel" Grid.Row="1" Width="1000" Margin="12,0,12,0">
            <StackPanel>
                ...

在文件后面的代码中(此处为 MainPage.cs):

        public static readonly DependencyProperty ScrollViewVerticalOffsetProperty =
        DependencyProperty.Register(
                                    "ScrollViewVerticalOffset",
                                    typeof(double),
                                    typeof(MainPage),
                                    new PropertyMetadata(new PropertyChangedCallback(OnScrollViewVerticalOffsetChanged))
                                    );

        public static readonly DependencyProperty ScrollViewHorizontalOffsetProperty =
        DependencyProperty.Register(
                                    "ScrollViewHorizontalOffset",
                                    typeof(double),
                                    typeof(MainPage),
                                    new PropertyMetadata(new PropertyChangedCallback(OnScollViewHorizontalOffsetChanged))
                                    );

    private ScrollViewer _listScrollViewer;

    private void ScrollViewer_Loaded_1(object sender, RoutedEventArgs e)
    {
        _listScrollViewer = sender as ScrollViewer;

        Binding binding1 = new Binding();
        binding1.Source = _listScrollViewer;
        binding1.Path = new PropertyPath("VerticalOffset");
        binding1.Mode = BindingMode.OneWay;
        this.SetBinding(ScrollViewVerticalOffsetProperty, binding1);

        Binding binding2 = new Binding();
        binding2.Source = _listScrollViewer;
        binding2.Path = new PropertyPath("HorizontalOffset");
        binding2.Mode = BindingMode.OneWay;
        this.SetBinding(ScrollViewHorizontalOffsetProperty, binding2);
    }

    public double ScrollViewVerticalOffset
    {
        get { return (double)this.GetValue(ScrollViewVerticalOffsetProperty); }
        set { this.SetValue(ScrollViewVerticalOffsetProperty, value); }
    }

    public double ScrollViewHorizontalOffset
    {
        get { return (double)this.GetValue(ScrollViewHorizontalOffsetProperty); }
        set { this.SetValue(ScrollViewHorizontalOffsetProperty, value); }
    }

    private static void OnScrollViewVerticalOffsetChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        MainPage page = obj as MainPage;
        ScrollViewer viewer = page._listScrollViewer;

        // ... do something here
    }

    private static void OnScollViewHorizontalOffsetChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        MainPage page = obj as MainPage;
        ScrollViewer viewer = page._listScrollViewer;

        // ... do something here
    }
于 2013-01-22T09:58:29.693 回答
0

这是我使用的 XAML 代码

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0" LayoutUpdated='ContentPanel_LayoutUpdated'>

        <ScrollViewer x:Name='scroller' VerticalAlignment='Stretch' VerticalScrollBarVisibility='Visible' >
            <StackPanel
                x:Name='listItems'></StackPanel>
        </ScrollViewer>
    </Grid>

这是后面的 C# 代码

private void ContentPanel_LayoutUpdated(object sender, EventArgs e)
    {
        var offset = scroller.VerticalOffset;
    }

每当滚动滚动条时,网格(容器网格)的布局就会发生变化,因此会触发布局更新事件……请尝试通过在事件中放置断点并查找偏移值来进行调试……

于 2013-01-22T11:12:51.543 回答
0

将属性 ManipulationMode="Control" 添加到 ScrollViewer。这是必要的,因为否则 UI 线程将不会收到足够的 ScrollViewer 滚动值来获得流畅的动画 - 正常模式是 Windows Phone 的性能优化,您需要绕过它!

于 2014-04-04T15:05:12.133 回答