WPF Ограничить размер экспандера - PullRequest
3 голосов
/ 05 декабря 2010

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

Очевидным решением было бы установить MaxHeight Treeview, но я не могу определить его легко, потому что доступная высота зависит от

  • Высота окна
  • Другие расширители (открытые / закрытые)

Что мне нужно изменить, чтобы высота вида дерева по-прежнему автоматически увеличивалась, но не превышала высоту окна?

<StackPanel CanVerticallyScroll="True" ClipToBounds="False" Height="Auto" Name="StackPanel2" Width="250" DockPanel.Dock="Left" Orientation="Vertical" VerticalAlignment="Top" CanHorizontallyScroll="False" Margin="5">
    <Border BorderThickness="0" CornerRadius="5" Padding="1" BorderBrush="Red" Margin="0,5" >
        <Expander Header="Expander3" Height="Auto" IsExpanded="False" Width="Auto" Margin="2" BorderThickness="1">
           <Grid  Height="Auto" Width="Auto" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" >

            <TreeView Height="Auto" BorderThickness="1" Margin="0,0,0,0" Padding="7" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" >
           </TreeView>

        </Grid>
    </Expander>
    </Border>
</StackPanel>

1 Ответ

2 голосов
/ 05 декабря 2010

Один из способов, который я могу придумать, - поместить StackPanel в ScrollViewer.Таким образом, убедитесь, что он никогда не выходит за пределы высоты окна.Вы не получите отдельного Свитка для каждого из ваших расширителей (если они находятся в одной и той же StackPanel?), Но я не уверен на 100%, что вы ищете здесь.

<ScrollViewer Name="stackPanelScrollViewer"
              Loaded="stackPanelScrollViewer_Loaded"
              VerticalScrollBarVisibility="Auto">
    <StackPanel CanVerticallyScroll="True" ClipToBounds="False" Height="Auto" Name="StackPanel2" Width="250" DockPanel.Dock="Left" Orientation="Vertical" VerticalAlignment="Top" CanHorizontallyScroll="False" Margin="5">
        <Border BorderThickness="0" CornerRadius="5" Padding="1" BorderBrush="Red" Margin="0,5" >
            <Expander Header="Expander3" Height="Auto" IsExpanded="False" Width="Auto" Margin="2" BorderThickness="1">
                <Grid  Height="Auto" Width="Auto" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" >
                    <TreeView Name="treeView1" Height="Auto" BorderThickness="1" Margin="0,0,0,0" Padding="7" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" >
                    </TreeView>
                </Grid>
            </Expander>
        </Border>
    </StackPanel>
</ScrollViewer>

Недостатком является то, что TreeView имеет собственный ScrollViewer, определенный в его ControlTemplate, поэтому вы не сможете прокручивать с помощью MouseWheel, если мышь расположена над TreeView.Обходной путь к этому состоит в том, чтобы прикрепить обработчик события MouseWheel для каждого TreeView и сделать оттуда Scroll

private void stackPanelScrollViewer_Loaded(object sender, RoutedEventArgs e)
{
    treeView1.AddHandler(MouseWheelEvent, new RoutedEventHandler(StackPanelMouseWheel), true);
    //treeView2.AddHandler(MouseWheelEvent, new RoutedEventHandler(StackPanelMouseWheel), true);
}
private void StackPanelMouseWheel(object sender, RoutedEventArgs e)
{
    MouseWheelEventArgs eargs = (MouseWheelEventArgs)e;
    double x = (double)eargs.Delta;
    double y = stackPanelScrollViewer.VerticalOffset;
    stackPanelScrollViewer.ScrollToVerticalOffset(y - x);
}
...