1

このサンプルhttp://www.codeproject.com/Articles/109531/Controlling-and-Viewing-the-ScrollBar-Positions-に従って、データグリッドのスクロール バーを前の位置に戻す方法を実装しようとしています。しかしこのメソッドは常に null を返すため、オートメーションを作成できません。これが常に null を返す理由を知っている人はいますか?

    public static IScrollProvider GetScrollProvider(DataGrid grid)
    {
        var p = FrameworkElementAutomationPeer.FromElement(grid)
            ?? FrameworkElementAutomationPeer.CreatePeerForElement(grid);
        return p.GetPattern(PatternInterface.Scroll) as IScrollProvider;
    }
4

2 に答える 2

1

古代の歴史ですが、少なくとも現在のバージョンは、すべての場合にうまく機能しているようです.

//p.GetPattern(PatternInterface.Scroll) as IScrollProvider;
{System.Windows.Automation.Peers.DataGridAutomationPeer}
    [System.Windows.Automation.Peers.DataGridAutomationPeer]: 
        {System.Windows.Automation.Peers.DataGridAutomationPeer}
    HorizontallyScrollable: true
    HorizontalScrollPercent: 0.0
    HorizontalViewSize: 81.44329896907216
    VerticallyScrollable: true
    VerticalScrollPercent: 29.062733871459486
    VerticalViewSize: 2.9625
于 2014-09-29T16:23:54.043 に答える
0

私はそれが古い投稿であることを知っていますが、誰かが同じ問題でここに来た場合(私のように)、ここに私がそれを解決した方法があります:

何らかの理由で、DataGrid のスクロールバーを使用すると、ユーザーがまだスクロールしていない場合、最大位置が 0 でなくても、最大位置が 0 であることが通知されます。だから私は更新する前に最大値を保存し、後にそれを復元します:

まず、これらの値を保存するクラスを作成します。それは変数かもしれませんが、クラスはより組織化されているように見えました:

public class ScrollInfo
{
    public double HorizontalPosition;
    public double HorizontalMaximum;
    public double VerticalPosition;
    public double VerticalMaximum;
}

ItemSource プロパティを更新する前に、このメソッドを使用してスクロール情報を保存します。

public static ScrollInfo GetScrollInfo(this DataGrid grid)
{
    ScrollInfo oInfo = new ScrollInfo();

    ScrollBar sbHorizontal = grid.GetScrollbar(ScrollMode.Horizontal);
    oInfo.HorizontalMaximum = sbHorizontal.Maximum;
    oInfo.HorizontalPosition = sbHorizontal.Value;

    ScrollBar sbVertical = grid.GetScrollbar(ScrollMode.Vertical);
    oInfo.VerticalMaximum = sbVertical.Maximum;
    oInfo.VerticalPosition = sbVertical.Value;

    return oInfo;
}

そして、このメソッドを呼び出して、更新後にこの情報をグリッドに戻します。

public static void SetScrollPosition(this DataGrid grid, ScrollInfo info)
{
    if (info.HorizontalPosition > 0)
    {
        ScrollBar sbHorizontal = grid.GetScrollbar(ScrollMode.Horizontal);
        sbHorizontal.Maximum = info.HorizontalMaximum;
        grid.Scroll(ScrollMode.Horizontal, info.HorizontalPosition);
    }

    if (info.VerticalPosition > 0)
    {
        ScrollBar sbVertical = grid.GetScrollbar(ScrollMode.Vertical);
        sbVertical.Maximum = info.VerticalMaximum;            
        grid.Scroll(ScrollMode.Vertical, info.VerticalPosition);
    }
}

作業を簡単にするために、UpdateItemSource メソッドも作成します。

public static void UpdateItemSource(this DataGrid grid, IEnumerable itemSource)
{
    ScrollInfo oInfo = grid.GetScrollInfo();
    grid.ItemsSource = itemSource;
    grid.SetScrollPosition(oInfo);
}

私が使用する他の方法は、質問を投稿したユーザーが行ったのと同じ投稿から取ったと思います。

public static void Scroll(this DataGrid grid, ScrollMode mode, double position)
{
    // Get the scrollbar and convert the position to percent.
    var scrollBar = grid.GetScrollbar(mode);
    double positionPct = ((position / scrollBar.Maximum) * 100);

    // Scroll to a specfic percentage of the scrollbar.
    grid.ScrollToPercent(mode, positionPct);
}

public static void ScrollToPercent(this DataGrid grid, ScrollMode mode, double percent)
{
    // Fix the percentage.
    if (percent < 0)
        percent = 0;
    else if (percent > 100)
        percent = 100;

    // Get the scroll provider.
    var scrollProvider = GetScrollProvider(grid);

    // Scroll.
    switch (mode)
    {
        case ScrollMode.Vertical:                        
            scrollProvider.SetScrollPercent( System.Windows.Automation.ScrollPatternIdentifiers.NoScroll, percent);
            break;
        case ScrollMode.Horizontal:
            scrollProvider.SetScrollPercent(percent, System.Windows.Automation.ScrollPatternIdentifiers.NoScroll);
            break;
    }
}
于 2016-04-19T17:21:39.237 に答える