Невозможно получить вертикальные полосы прокрутки в текстовом блоке WPF - PullRequest
4 голосов
/ 11 апреля 2011

Я представляю текст в элементе управления 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, что, конечно, не подойдет.

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

Спасибо!

1 Ответ

9 голосов
/ 11 апреля 2011

Поскольку ваш ScrollViewer находится в StackPanel, ему будет предоставлено столько вертикального пространства, сколько необходимо для отображения его содержимого.

Вам потребуется использовать родительскую панель, ограничивающую вертикальное пространство, например DockPanel или Grid.

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