Невозможно получить вертикальный полосы прокрутки в WPF TextBlock

Я представляю текст в элементе управления WPF TextBlock (.Net 3.5). Содержимое текстового блока меняется в зависимости от того, что пользователь выбирает в списке. Текст переносится, поэтому мне не нужна горизонтальная полоса прокрутки. Однако текста часто бывает больше, чем может отображать окно, поэтому мне нужна вертикальная полоса прокрутки.

Когда я начал поиск, я быстро обнаружил, что ответ - обернуть TextBlock в ScrollViewer. Однако это не работает (TM), и я надеюсь, что кто-то может помочь мне разобраться, почему.

Это структура кода пользовательского интерфейса:

<Window x:Class=..>
    <StackPanel>
        <ListBox HorizontalAlignment="Stretch"
                 VerticalAlignment="Top"  Height="200"
                 SelectionChanged="listbox_changed" SelectionMode="Single">
        </ListBox>
        <Button Click="Select_clicked">Select</Button>
        <ScrollViewer VerticalScrollBarVisibility="Auto">
            <TextBlock Name="textblock" TextWrapping="Wrap"/>
        </ScrollViewer>
    </StackPanel>
</Window>

Когда пользователь выбирает элемент в списке, появляется текст связанный с этим элементом представлен в TextBlock. Я бы подумал, что код в его нынешнем виде должен быть всем, что требуется, но он никогда не предоставляет мне полосу прокрутки.

Поиск и эксперименты дали мне две подсказки: корень проблемы мог быть связан с тем, что я обновлял содержимое TextBlock динамически и что TextBlock не изменяет свой размер в зависимости от нового содержимого. Я нашел сообщение, которое казалось актуальным, в котором говорилось, что, установив высоту TextBlock на его ActualHeight (после изменения его содержимого), он будет работать. Но этого не произошло (я не вижу эффекта от этого).

Во-вторых, если я установлю высоту (во время разработки) ScrollViewer, то я получу вертикальную полосу прокрутки. Например, если я установил для него значение 300 в приведенном выше xaml, результат будет почти хорошим в том смысле, что первое открытое окно содержит TextBlock с вертикальной полосой прокрутки, когда (и только когда) мне это нужно. Но если я увеличиваю окно (изменяя его размер с помощью мыши во время выполнения), ScrollViewer не использует новый размер окна и вместо этого сохраняет его высоту в соответствии с xaml, что, конечно же, не годится.

Надеюсь, я ' я просто упустил из виду кое-что очевидное ..

Спасибо!

5
задан Kristoffer 11 April 2011 в 12:13
поделиться