1

C#とXAMLを使用して、Windows8用のある種のチャットアプリケーションを作成します。

チャットリストには、ObservableCollectionにバインドされたListViewを使用しています。カスタムコントロールを使用しているメッセージアイテムの場合、RichTextBlockが含まれています。

ListViewを一番下までスクロールして、新しいメッセージを表示したいと思います。私が直面した問題: ScrollIntoViewメソッドは、メッセージアイテム全体を表示せず、メッセージアイテムの上部のみを表示します。

そこで、WinRT XAML Toolkitのソリューションも試しました。ListViewのScrollViewerを取得し、ScrollViewerのメソッドを使用します。

public static void ScrollToBottom(this ListView listView)
{
   var scrollViewer = listView.GetFirstDescendantOfType<ScrollViewer>();
   scrollViewer.ScrollToVerticalOffset(scrollViewer.ScrollableHeight);
}

public static void ScrollToBottom(this ListView listView)
{
   var scrollViewer = listView.GetFirstDescendantOfType<ScrollViewer>();
   scrollViewer.ScrollToVerticalOffset(scrollViewer.ExtentHeight);
}

同じ効果で。一部のメッセージ項目が完全にスクロールされていません。

また、スクロールする前に遅延を作成しようとしました:new ManualResetEvent(false).WaitOne(2000);

自動スクロール可能なチャットリストを作成する方法については、これ以上アイデアがありません。どうすればこれを行うことができますか?

どのWindowsメッセージングアプリケーションがListView(StackPanel ??)を使用していないようです。 Windowsチャットサンプル

これにはStackPanelを使用する方が簡単かもしれません。

4

1 に答える 1

1

observablecollectionに新しいチャットメッセージを追加する以下のようなコードがあると思います

var newChatMsg = new ChatMsg("foo foo bar bar");
messageObservableColllection.Add(newChatMsg);

あなたがする必要があるのは、Add()にすべての直後に次のコード行を追加することです

this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                listbox1.ScrollIntoView(newChatMsg);
            });

これにより、ディスパッチャキューに最後に追加されたチャットメッセージにListViewをスクロールする呼び出しが行われます。このチャットメッセージは、INofityPropertyが起動し、新しいメッセージでListViewを更新した後のある時点で起動します。これは、アイテムが追加または削除されたときに実行する必要のあるアニメーションがある場合に重要です。

最後に、アイテムが完全にスクロールして表示されない場合は、アイテムの高さに問題がある可能性があります。ScrollIntoViewにはオーバーライドがあり、コンテンツを整列させるフレームのエッジを指定できます。特定の子要素を表示する場合は、スクロールする追加の量を手動で指定することもできます。詳細については、MSDNフォーラムの投稿を参照してください。

http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/24e91a3e-6cd3-468b-97eb-c90f39532aba

于 2012-08-27T18:13:36.593 に答える