6

C# から Silverlight ListBox のスクロール位置を動的に変更したいのですが、C# から ListBox コントロールの ScrollViewer 要素にアクセスする方法を知る必要がありますか?

ありがとう、ジェフ

4

5 に答える 5

3

良い質問。私はそれを直接行う方法を見つけられませんでしたが、Silverlight Controls プロジェクト (いくつかのクラスの項目コントロールでスクロールビューアーを使用しています) を調べることでかなり近くなりました。これを取得する方法は次のとおりですが、カスタム リストボックスが必要です。

public class TestBox : ListBox
{
    private ScrollViewer _scrollHost;

    protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        var itemsHost = VisualTreeHelper.GetParent(element) as Panel;

        for (DependencyObject obj = itemsHost; obj != item && obj != null; obj = VisualTreeHelper.GetParent(obj))
        {
            ScrollViewer viewer = obj as ScrollViewer;
            if (viewer != null)
            {
                _scrollHost = viewer;
                break;
            }
         }

        base.PrepareContainerForItemOverride(element, item);
    }
}

そのイベントにフックする別の方法 (またはそのパネルを取得する別の方法) があるかもしれません。ListBox のテンプレートを見ると、スクロール ビューアーの名前が実際には「ScrollViewer」であることがわかりますが、GetTemplateChild メソッドは保護されているため、カスタム クラスを作成する必要があります。

于 2008-11-05T22:21:37.033 に答える
1

簡単にしましょう...リストボックステンプレートに、ScrollViewerコントロールが含まれている場合があります。そのためのロードされたメソッドを追加すると、送信者引数から自分自身を取得します。

private void ScrollViewer_Loaded(object sender, System.Windows.RoutedEventArgs e)
    {
        myScrollViewer = (sender as ScrollViewer);
    }

これは私のために働く

于 2012-10-13T17:45:21.593 に答える
0

あなたは呼び出すことができます:

myListBox.ApplyTemplate();

ListBox ビジュアル ツリーを強制的に作成します。そうしないと、すぐにアクセスしようとすると、GetTemplateChild() は Null を返します。

これは " Erno de Weerd " の説明と組み合わせるとうまく機能します: ListBox を継承して GetTemplateChild() メソッドを呼び出せるようにします。

私も試しました:

  • ListBox 拡張メソッド "GetScrollHost()" を使用する方法ですが、(ページ全体を初期化した後でも) うまくいきませんでした。
  • 「FindName()」ですが、ListBox テンプレートに ScrollViewer 名を指定しても機能しませんでした。

エマニュエル (シルバーライト 3)

于 2010-02-03T09:29:06.800 に答える
-1
ScrollViewer scrollViewer = yourListBox.getScrollHost();

リストボックスにデータソースが設定されていない場合はnullです。私の場合、以下のコードが実行された後にのみUI要素が正しく返されます。

myListBox.ItemsSource = list;
于 2009-11-30T14:24:49.623 に答える