Проблема WPF ScrollViewer - PullRequest
3 голосов
/ 14 июля 2011

Я пытаюсь использовать простой ScrollViewer в моей программе, но у меня возникла проблема.

Если я включаю все в моей программе в ScrollViewer, он работает нормально:

<Window x:Class="WpfTest.MainWindow"         
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Name="PrimaryWindow">
    <ScrollViewer>
        <StackPanel>
            <Menu Height="21" VerticalAlignment="Top">
                <MenuItem Header="File"/>
                <MenuItem Header="Edit"/>
            </Menu>
            <StackPanel>
                <TextBlock Text="1"/>
                <TextBlock Text="2"/>
                <TextBlock Text="3"/>
                <TextBlock Text="4"/>
                <TextBlock Text="5"/>
                <TextBlock Text="6"/>
                <TextBlock Text="7"/>
                <TextBlock Text="8"/>
                <TextBlock Text="9"/>
                <TextBlock Text="10"/>
            </StackPanel>
        </StackPanel>
    </ScrollViewer>
</Window> 

Однако, поскольку меню является частью ScrollViewer, меню прокручивается за пределы экрана, когда пользователь выполняет прокрутку вниз.Поэтому я поместил ScrollViewer только вокруг элементов управления в меню:

<Window x:Class="WpfTest.MainWindow"         
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Name="PrimaryWindow">
    <StackPanel>
        <Menu Height="21" VerticalAlignment="Top">
            <MenuItem Header="File"/>
            <MenuItem Header="Edit"/>
        </Menu>
        <ScrollViewer>
            <StackPanel>
                <TextBlock Text="1"/>
                <TextBlock Text="2"/>
                <TextBlock Text="3"/>
                <TextBlock Text="4"/>
                <TextBlock Text="5"/>
                <TextBlock Text="6"/>
                <TextBlock Text="7"/>
                <TextBlock Text="8"/>
                <TextBlock Text="9"/>
                <TextBlock Text="10"/>
            </StackPanel>
        </ScrollViewer>
    </StackPanel>
</Window> 

Но на этот раз ScrollViewer не работает!т. е. даже если я изменю размер окна, чтобы оно было меньше высоты, требуемой для надписей, полоса прокрутки не активируется.

Что я делаю не так?

Ответы [ 3 ]

6 голосов
/ 14 июля 2011

Проблема вызвана вашей корневой StackPanel, StackPanel не ограничивает вертикальную высоту ScrollViewer.

Попробуйте вместо этого использовать DockPanel для позиционирования меню:

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<DockPanel>
    <Menu DockPanel.Dock="Top" Height="21" VerticalAlignment="Top">
        <MenuItem Header="File"/>
        <MenuItem Header="Edit"/>
    </Menu>
    <ScrollViewer>
        <StackPanel>
            <TextBlock Text="1"/>
            <TextBlock Text="2"/>
            <TextBlock Text="3"/>
            <TextBlock Text="4"/>
            <TextBlock Text="5"/>
            <TextBlock Text="6"/>
            <TextBlock Text="7"/>
            <TextBlock Text="8"/>
            <TextBlock Text="9"/>
            <TextBlock Text="10"/>
        </StackPanel>
    </ScrollViewer>
</DockPanel>

1 голос
/ 24 января 2013

Никогда не используйте StackPanel с ScrollViewer внутри него, потому что StackPanel настолько велика, насколько его содержимое хочет!Таким образом, ScrollViewer считает, что у него всегда достаточно места!

ScrollViewer должен быть вне всего

1 голос
/ 14 июля 2011

ScrollViewer будет отображать свои столбцы, только когда высота или ширина элемента Ancestor изменились.Итак, ваш Ancestor - это StackPanel, и он не меняет размер при изменении размера окна.

...