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 ファイル (メインページのサンプルはこちら):

        <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 に答える