WPF 限制扩展器的大小

标签 wpf resize height expander

我在扩展器中有多个 TreeView ,它们的高度可以随内容一起增长。但是当高度大于窗口的大小时,它就会超出窗口。

显而易见的解决方案是设置 Treeview 的 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>

最佳答案

我能想到的一种方法是将 StackPanel 放在 ScrollViewer 中。这样可以确保它永远不会超出窗口的高度。您不会为每个扩展器获得单独的 Scroll(如果它们在同一个 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 在其 ControlTemplate 中定义了自己的 ScrollViewer,因此如果鼠标位于 TreeView 上,您将无法使用 MouseWheel 进行滚动。解决方法是为每个 TreeView 附加一个 MouseWheel 事件处理程序,并从那里制作 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);
}

关于WPF 限制扩展器的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4360736/

相关文章:

c# - 后台 worker 卡住WPF

c# - 添加 Style 时多次设置属性 'Content'

java - 如何在 JavaFX 中的 SplitPane Divider 上检测鼠标拖动事件

ios - 无法根据其内容设置 UITextView 高度

c# - 如何在鼠标悬停时设置 ComboBox 背景的样式?

WPF:如何在弹出窗口中自动调整 Web 浏览器的大小?

c# - 获取图像的高度和宽度

ios - 快速删除图像中的像素

html - 如何根据文本的长度使图像的高度增长?

html - css height, max-height, line-height VS.垂直对齐