1

さまざまなアイテムが追加されるリストボックスがあります。リストボックスに新しいアイテムが追加されたら、そのアイテムをスクロールして表示する必要があります (基本的には一番下までスクロールします)。

新しい項目が追加されたときに ListBox を自動スクロールするにはどうすればよいですか?の解決策を試しました。また、このブログ投稿から

ただし、リストボックスに可変高さのアイテムが含まれているため、どちらのソリューションも機能しません。代わりに、リストボックス項目テンプレートをハックして高さを固定すると、うまくいくようです。以下は、私のアイテム テンプレートの 1 つの例です。

<DataTemplate x:Key="StatusMessageTemplate">
    <Grid Grid.Column="1" VerticalAlignment="top" Margin="0,5,10,0">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="20"></RowDefinition>
        </Grid.RowDefinitions>
        <TextBlock Text="{Binding Path=MessageText}" HorizontalAlignment="Left" Grid.Row="0" Grid.Column="0" FontWeight="Bold" Foreground="{DynamicResource LightTextColorBrush}"/>
        <TextBlock Text="{Binding Path=created_at, StringFormat=t}" Style="{StaticResource Timestamp}" TextWrapping="Wrap"  HorizontalAlignment="Right" Grid.Row="0" Grid.Column="1"/>
    </Grid>
</DataTemplate>

高さに関係なく、新しいアイテムをスクロールして表示するにはどうすればよいですか?

4

2 に答える 2

2

そのアイテムをスクロールして表示する必要があります(基本的には一番下までスクロールします)。

Listbox に高さが可変の項目がある場合、ScrollIntoView の動作がおかしい。

一番下までスクロールすることが唯一の目的である場合は、Scrollviewer に直接アクセスして、以下に示すように可能な最大オフセットまでスクロールできます。

var scrollViewer = GetDescendantByType(ListBoxChats, typeof(ScrollViewer)) as ScrollViewer;
scrollViewer.ScrollToVerticalOffset(Double.MaxValue);

public static Visual GetDescendantByType(Visual element, Type type)
{
    if (element == null)
    {
        return null;
    }
    if (element.GetType() == type)
    {
        return element;
    }
    Visual foundElement = null;
    if (element is FrameworkElement)
    {
        (element as FrameworkElement).ApplyTemplate();
    }
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
    {
        Visual visual = VisualTreeHelper.GetChild(element, i) as Visual;
        foundElement = GetDescendantByType(visual, type);
        if (foundElement != null)
        {
            break;
        }
    }
    return foundElement;
}

GetDescendantByType は、punker76 @別の SO 投稿によって作成されたヘルパー関数です。

于 2015-06-09T15:01:33.787 に答える
1

私は問題を見つけたと思います。高さが可変の項目は、表示されるまで計算されません。そこで、ScrollIntoView 関数を呼び出すタイマーを追加します。しかし、それでもうまくいかなかったので、VisualTreeHelper を使用して ScrollViewer オブジェクトを見つけ、それを特定の行に強制しました。これがコードです。

     System.Windows.Threading.DispatcherTimer dTimer = new System.Windows.Threading.DispatcherTimer();
     dTimer.Interval = new TimeSpan(0, 0, 0, 0, 200); // 200 Milliseconds
     dTimer.Tick += new EventHandler(
        (seder, ea) =>
        {
           //Verses.ScrollIntoView(Verses.Items[itemIndex]);
           for (int i = 0; i < VisualTreeHelper.GetChildrenCount(Verses); i++)
           {
              DependencyObject depObj = VisualTreeHelper.GetChild(Verses, i);
              if (depObj is ScrollViewer)
              {
                 ScrollViewer sv = depObj as ScrollViewer;
                 sv.ScrollToVerticalOffset(itemIndex); // Zero based index
                 break;
              }
           }
           dTimer.Stop();
        });
     dTimer.Start();
于 2013-09-19T17:44:27.623 に答える