C# から Silverlight ListBox のスクロール位置を動的に変更したいのですが、C# から ListBox コントロールの ScrollViewer 要素にアクセスする方法を知る必要がありますか?
ありがとう、ジェフ
C# から Silverlight ListBox のスクロール位置を動的に変更したいのですが、C# から ListBox コントロールの ScrollViewer 要素にアクセスする方法を知る必要がありますか?
ありがとう、ジェフ
良い質問。私はそれを直接行う方法を見つけられませんでしたが、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 メソッドは保護されているため、カスタム クラスを作成する必要があります。
簡単にしましょう...リストボックステンプレートに、ScrollViewerコントロールが含まれている場合があります。そのためのロードされたメソッドを追加すると、送信者引数から自分自身を取得します。
private void ScrollViewer_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
myScrollViewer = (sender as ScrollViewer);
}
これは私のために働く
あなたは呼び出すことができます:
myListBox.ApplyTemplate();
ListBox ビジュアル ツリーを強制的に作成します。そうしないと、すぐにアクセスしようとすると、GetTemplateChild() は Null を返します。
これは " Erno de Weerd " の説明と組み合わせるとうまく機能します: ListBox を継承して GetTemplateChild() メソッドを呼び出せるようにします。
私も試しました:
エマニュエル (シルバーライト 3)
ScrollViewer scrollViewer = yourListBox.getScrollHost();
リストボックスにデータソースが設定されていない場合はnullです。私の場合、以下のコードが実行された後にのみUI要素が正しく返されます。
myListBox.ItemsSource = list;