Windows Phone 7 - ScrollViewer 值已更改

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

你能发一下你正在使用的代码吗? - Christopher Cabezudo Rodriguez
这是因为“LayoutUpdated”事件在您停止手势输入(滑动)后首先触发。请查看手势事件,例如delta事件。 - Frederik Winstrup Johansen
3个回答

4
通过使用scrollviewer的依赖属性,即HorizontalOffset和VerticalOffset,可以实现。关键是将事件绑定到scrollviewer上,在load事件处理程序中完成。如果在scrollviewer中放置一个宽的网格,就可以获得偏移量!在您的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
    }

谢谢您的回复,它确实起作用。但这并不是我问题的100%解决方案。刷新偏移太慢了。我需要在滚动时调整图像大小。这段代码可以工作,但不够流畅。有什么想法吗? - Brzooz
你需要在这里放置一些代码来展示你的问题。图像视图和性能有许多解决方案和问题! - Frederik Winstrup Johansen

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

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

这似乎也刷新得太慢了。你可以滚动很多次,而没有任何事件被触发。 - RandomEngy

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接