Я представляю текст в элементе управления wpf TextBlock (.Net 3.5). Содержимое текстового блока варьируется в зависимости от того, что пользователь выбирает в списке. Текст переносится, поэтому мне не нужна горизонтальная полоса прокрутки. Однако текста часто больше, чем может отображать окно, поэтому мне нужна вертикальная полоса прокрутки.
Когда я начал поиск, я быстро обнаружил, что ответ заключается в том, чтобы обернуть TextBlock в ScrollViewer. Тем не менее, это не работает (ТМ), и я надеюсь, что кто-то может помочь мне понять, почему.
Это структура кода пользовательского интерфейса:
<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 значение ActualHeight (после изменения его содержимого), оно будет работать. Но это не так (я не вижу никакого эффекта от этого).
Во-вторых, если я установлю высоту (во время разработки) ScrollViewer, то получу вертикальную полосу прокрутки. Например, если я установил его на 300 в приведенном выше xaml, результат будет почти хорошим, поскольку окно, которое было открыто в первый раз, содержит TextBlock с вертикальной полосой прокрутки, когда (и только когда) он мне нужен. Но если я увеличу окно (изменяя его размер с помощью мыши во время выполнения), ScrollViewer не использует новый размер окна и вместо этого сохраняет свою высоту в соответствии с xaml, что, конечно, не подойдет.
Надеюсь, я просто упустил что-то очевидное ..
Спасибо!