Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF限制扩展器的大小_Wpf_Resize_Height_Expander - Fatal编程技术网

WPF限制扩展器的大小

WPF限制扩展器的大小,wpf,resize,height,expander,Wpf,Resize,Height,Expander,我在扩展器中有一个多个TreeView,它可以随着内容的增加而增加高度。但是当高度超过窗户的尺寸时,它就会飞出窗外 显而易见的解决方案是设置Treeview的MaxHeight,但我无法轻松确定它,因为可用高度取决于 窗高 其他扩展器(打开/关闭) 我需要做什么改变才能使树视图的高度仍然自动增长,但永远不会超过窗口的高度 <StackPanel CanVerticallyScroll="True" ClipToBounds="False" Height="Auto" Name="Sta

我在扩展器中有一个多个TreeView,它可以随着内容的增加而增加高度。但是当高度超过窗户的尺寸时,它就会飞出窗外

显而易见的解决方案是设置Treeview的MaxHeight,但我无法轻松确定它,因为可用高度取决于

  • 窗高
  • 其他扩展器(打开/关闭)
我需要做什么改变才能使树视图的高度仍然自动增长,但永远不会超过窗口的高度

<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>

我能想到的一种方法是将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>

谢谢你的回答!我也考虑过这个方法,但我真的需要树状视图中的滚动条,而不是stackpanel或其扩展器中的滚动条。因此,如果我有3个扩展器,只有最后一个会在树视图中显示滚动条。但如果结果证明这是不可能的,我会把你的解决方案作为答案。@Joshua:看看我是否理解正确。这是否意味着第一个和第二个treeview的高度永远不会超出窗口的高度?否则,如果第二个树状视图扩展,第三个树状视图被“推”到窗口之外,会发生什么?所有树视图都在同一个StackPanel中吗?所有树视图都在同一个StackPanel中。你是对的,第二个treeview可能也会在窗口外扩展(使第三个不可见),但在我的应用程序中,这不太可能(但仍然可能)。如果第三个treeview根据剩余空间自动调整大小,对我来说就足够了;)
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);
}